一般情况下, JVM的参数不要设置,但是如果想要程序发挥更大威力,我们就需要对JVM的各项参数进行优化配置以便获取最佳性能,通过设置达到的如下目标 [不全的欢迎补充] :
很明显前两个是矛盾的, 要想GC时间小必须有一个更小的堆, 而要想GC次数足够少必须要有一个更大的堆,只有两者达到平衡才能使JVM达到最优,过多的GC与Full GC会占用更多的系统资源[主要是CPU], 影响系统的吞吐量.特别要关注Full GC, 因为它会对整个堆进行整理, 导致Full GC主要有以下原因:
调优时尽量让对象在新生代被GC时回收, 让对象在新生代多存活一段时间和不要创建过大的对象及数组避免直接在旧生代创建对象;
增加Pemanet Generation空间,避免过多静态对象,控制好新生代与旧生代的比例
垃圾回收不要手动调用, 尽量依靠JVM自身的机制
调优手段主要通过控制堆内存的各个部分的比例与GC策略来的, 下面看看各个部分比例设置不良会导致什么后果
a. 新生代GC次数频繁, 消耗系统资源; b. 导致大对象直接进去旧生代, 占据了旧生代剩余空间, 容易诱发Full GC;
一是新生代设置过大,会导致旧生代过小[堆总量一定],从而诱发Full GC, 二是新生代耗时大幅增加,一般来说新生代占堆内存1/3比较合适,
导致对象从eden直接进入旧生代,降低了在新生代存活的时间
导致eden过小,增加了GC的频率
ps: 通过-XX:MaxTenuringThreshold=n来控制新生代存活时间, 尽量让对象在新生代回收
最后汇总一下JVM的常用配置:
堆设置:
-Xms 初始堆大小[没有冒号]
-Xms 最大堆大小
-Xmn 新生代大小
-XX:NewSize=n 设置新生代大小
-XX:NewRatio=n 设置新生代与旧生代大小, 如: n=3, 则表示新生代与旧生代的比值是1:3即新生代占整个年轻代与旧生代的1/4,
-XX:SurvivorRatio=n 年轻代中eden区与两个Survivor区的比值,值得注意的是Survivor区有两个, 如:3, 表示 Eden:Survivor=3:2, 一个Survivor区占整个新生代1/5.
-XX:MaxPermSize=n 设置持久代大小