JVM内存调优

JVM的常见配置汇总java


堆设置:并发

-Xms:初始堆大小  通常设置为小于4Gide

-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

相关文章
相关标签/搜索