JVM的常见配置汇总


堆设置:

-Xms:初始堆大小  一般设置为小于4G

-Xmx:最大堆大小  一般设置为小于4G

一般-Xms与Xmx的值相等,避免每次垃圾回收完成后JVM重新分配内存

-XX:NewSize=n 设置年轻代大小

-XX:NewRatio=n 设置年轻代和年老代的比值

如果设置了-XX:NewSize,那么久不在设置-XX:NewRatio


收集器的设置

-XX:+UseParallelGC:设置并行收集器

-XX:+UseConcMarkSweepGX:设置并发收集器



垃圾回收统计信息

-XX:+PrintGC



并行收集器设置:

-XX:ParallelGCThreads=n  根据CPU核数来设置。并行收集线程数



配置举例:

系统的可用武力内存限制:32位系统下,一般限制在1.5G-2G;

64位操作系统对内存无限制,但是一般设置在4G左右

典型设置:

java -Xmx3550m -Xms3550m -Xmn2g -Xss128k

-Xmn2g:持久代一般固定大小为64m



回收器的选择:

JDK5.0以后,JVM会根据当前系统配置进行判断




使用并发收集器时,开启对年老代的





JVM调优工具:

Jconsole、VisualVM:JDK自带






持久代被占满:

异常:java.lang.OutOfMeoryError:PermGen Space

Perm空间被占满,无法为新的


解决办法:

1.-XX:MaxPermSize=16m



堆栈溢出

异常:java.lang.StackOverflowerror

说明:一般就是递归没返回,或者循环调用造成



线程堆栈满

异常:Fatal:Stack size too small

说明:java中一个线程的空间大小是有限制的。JDK5.0以后这个值是1M。与这个线程相关的数据将会保存其中。但当线程空间满了以后,会出现上面异常

解决:增加线程栈大小。-Xss2m。但是这个配置无法解决根本问题,还要看代码部分是否有造成泄漏的部分


系统内存被占满

异常:java.lang.OutOfMeoryError:unable to create new native thread

说明:这个异常是由于操作系统没有足够的资源来产生这个线程造成的。系统创建线程时,除了要在Java堆中分配内存外,操作系统本身也需要分配资源来创建线程。因此,当线程数量大道一定程度以后,堆中或许还有空间,但是操作系统分配不出资源来了,就出现这个异常了。

通过修改-Xss来减少分配给单个线程的空间,也可以增加系统总共内生产的线程数。

解决:

1.重新设计系统减少线程数量

2.通过-Xss改变大小




常用命令:

jmap head

jmap -permstat

jmap -dump