java虽然是自动回收内存,但是应用程序,尤其服务器程序最好根据业务情况指明内存分配限制。否则可能导致应用程序宕掉。
举例说明含义:-Xms128m
表示JVM Heap(堆内存)最小尺寸128MB,初始分配
-Xmx512m
表示JVM Heap(堆内存)最大允许的尺寸256MB,按需分配。
说明:如果-Xmx不指定或者指定偏小,应用可能会导致java.lang.OutOfMemory错误,此错误来自JVM不是Throwable的,无法用try…catch捕捉。
PermSize和MaxPermSize指明虚拟机为java永久生成对象(Permanate generation)如,class对象、方法对象这些可反射(reflective)对象分配内存限制,这些内存不包括在Heap(堆内存)区之中。
-XX:PermSize=64MB 最小尺寸,初始分配
-XX:MaxPermSize=256MB 最大允许分配尺寸,按需分配
过小会导致:java.lang.OutOfMemoryError: PermGen space
MaxPermSize缺省值和-server -client选项相关。
-server选项下默认MaxPermSize为64m
-client选项下默认MaxPermSize为32m
相比Perm Size (permanent generation size)和 Heap Size,OutOfMemoryError 要更常见一些。一般当你遇到OutOfMemoryError 问题时,很多人会告诉你用下面种方法来解决问题:
•添加/调整启动参数-Xms 和 -Xmx,用以增大Heap Size
•以server 方式启动JVM,用以提高JVM”运行期”的执行效率
•检查程序,看是否有不合理的new 操作导致大量不必要的内存消耗
上面两种方法确能解决许多普通问题,但有时即使你设置了很大的Heap Size(比如-Xms128m -Xmx1024m),OutOfMemoryError 仍可能会出现,这时Perm Size 就可能与你有关了。
参见:
•http://lists.canoo.com/pipermail/webtest/2004q3/002460.html
•http://www.raibledesigns.com/page/rd?anchor=how_do_you_determine_a
•http://forum.java.sun.com/thread.jspa?threadID=775925
Perm Size 是部分与-Xms/mx 所指定的heap size无关的内存空间(default: 32M for client, 64M for server),所以即使你设置了再大的ms/mx 值,也仍然存在OutOfMemoryError 隐患。Perm Size 中存放了class 的metadata 等(google for more information)信息,如果你的应用中采用了 Spring、Hibernate 或 Tapestry 等基于 reflection 和 proxying 的框架时,你就很有可能会遇到OutOfMemoryError。
如果是这种情况那就考虑在启动时加入如下参数吧:-XX:PermSize=128m
至于如何选择最合适的PermSize值,可以参考
http://www.raibledesigns.com/page/rd?anchor=how_do_you_determine_a
里面提到了分析最优PermSize 值的几种方法。
注意:并非所有JVM vendor 开发的JVM 都支持/存在PermSize 问题。
另,OutOfMemoryError 的多与JVM 的 GC 有关,选择合适的GC 策略,合理设置启动选项会有很大帮助,参见:http://geniil.spaces.live.com/blog/cns!81B15F02616BA25C!204.entry
另在工作环境里可以使用jrocket