转 《JVM HeapSize Permsize》

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

转自http://www.wangdanwei.com/?p=80

 

你可能感兴趣的:(spring,jvm,应用服务器,Hibernate,tapestry)