JVM优化——JVM优化总结(7)

以上所有的知识都是为了这最后一步,调优,但是在调优之前我们要记住以下原则:

1. 多数的Java应用不需要在服务器上进行GC优化;
2. 多数导致GC问题的Java应用,都不是因为我们参数设置错误,而是代码问题;
3. 在应用上线之前,先考虑将机器的JVM参数设置到最优(最适合);
4. 减少创建对象的数量;
5. 减少使用全局变量和大对象;
6. GC优化是到最后不得已才采用的手段;
7. 在实际使用中,分析GC情况优化代码比优化GC参数要多得多;

GC 优化的目的有两个:

GC的时间足够短
GC的次数足够少

要想GC时间小必须要一个更小的堆,要保证GC次数足够少,必须保证一个更大的堆,这两者之间是相悖的,我们只能取其平衡,否则也不会有调优的说法。
(1)针对JVM堆的设置一般,可以通过-Xms -Xmx限定其最小、最大值,我们通常把最大、最小设置为相同的值,防止内存抖动。

(2)年轻代和年老代将根据默认的比例(1:2)分配堆内存,可以通过设置比率NewRadio的值来调整二者之间的大小,也可以通过-XX:newSize -XX:MaxNewSize来设置新生代绝对大小。同样,为了防止新生代内存抖动,我们通常会把-XX:newSize -XX:MaxNewSize设置为同样大小,也可以使用 -Xmn直接指定新生代大小。

(3)在配置较好的机器上(比如多核、大内存),可以为年老代选择并行收集算法: -XX:+UseParallelOldGC ,默认为Serial收集。

(4)线程堆栈的设置:每个线程默认会开启1M的堆栈,用于存放栈帧、调用参数、局部变量等,对大多数应用一般256K就足用。理论上,在内存不变的情况下,减少每个线程的堆栈,可以产生更多的线程,但这实际上还受限于操作系统。

那么什么情况下需要优化GC?一般满足下面的指标,一般不需要进行GC优化:

Minor GC执行时间不到50ms
Minor GC执行不频繁,约10s一次
Major GC执行时间不到1s
Major GC执行频率不频繁,不低于10分钟1次

下面请参考一个Java的参数配置,(服务器:Linux64Bit,8Core,16G)

1
2
3
JAVA_OPTS="$JAVA_OPTS -server -Xms3G -Xmx3G -Xmn1G -Xss256k -XX:PermSize=128m -XX:MaxPermSize=128m 
-XX:+UseParallelOldGC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/aaa/dump -XX:+PrintGCDetails
-XX:+PrintGCTimeStamps -Xloggc:/usr/aaa/dump/heap_trace.txt"

坚持原创技术分享,您的支持将鼓励我的继续创作