JVM调优基础

f663x 9年前

一、JVM调优基本流程
1、划分应用程序的系统需求优先级
2、选择JVM部署模式:单JVM、多JVM
3、选择JVM运行模式
4、调优应用程序内存使用
5、调优应用程序延迟
6、调优应用程序吞吐量

二、选择JVM部署模式:单JVM、多JVM
1、单JVM
优点:不需要管理多个JVM,降低管理成本; 应用程序消耗内存数量较少
缺点:存在单点故障,一个JVM失效时,整个系统失效。
2、多JVM
优点:更好的可用性,避免单点故障;更低延迟,因为垃圾收集所产生的停顿是程序延迟的主要原因,多JVM减少了每次Full GC所需的时间。
缺点:监控、管理困难,且消耗较多的内存数量。

三、选择JVM运行模式:
1、client与server模式
-client:把应用当成客户端类程序进行优化。该选项应该在应用启动时使用,对这类应用程序而言,内存占用是最重要的性能标准,远比高吞吐量重要。
-server:把应用当成服务器类程序进行优化。适用于高吞吐量比启动时间和内存占用更重要的应用程序。
目前还有一个较新的选项:
-server -XX:TieredCompilation:结合了二者的优点,可以考虑代替-client。

2、-32与-64
使用32位JVM还是64位JVM由应用程序使用的内存来决定,基本原则如下:
0~2G:32位
2G~32G:使用-d64 -XX:+UserCompressedOops
32G以上:64位
事实上,在Java6 Update18之后,JVM根据堆大小自动启用-XX:+UserCompressedOops,因此配置时2G以内使用-32,2G以上使用-64即可。
</div>

3、选择垃圾收集器
一般情况下,使用默认的Throughput收集器即可。

四、确定内存占用
1、垃圾收集基础
(1)三个性能属性(内存占用、延迟、吞吐量)中任何一个属性性能的提高几乎都是以另一个或者2个属性的性能损失作为代价的。
(2)在程序运行中开启垃圾收集器日志可以收集GC的大量信息,从而为调优作好数据准备,以下命令用于开启GC日志:
java -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:./test.log SignalGenerator
详细分析请见《JAVA性能优化权威指南》P194.

2、JAVA程序的内存布局
正如其它一切应用,JAVA在内存中的占用主要分为堆和栈2种,其中堆用于保存程序运行中的各种对象,栈用于保存程序的方法调用、线程调用等。
(1)栈:线程越多,方法调用层次越深,栈占用的内存就越大。
(2)堆:JVM中的堆分为三部分:新生代、老生代、永久代。

3、关于新生代、老生代、永久代。
(1)Java应用程序分配Java对象时,首先在新生代空间中分配对象。存活下来的对象,即经过几次Full GC之后还保持活跃的对象会被提升进入老生代空间。永久代空间中存放VM和Java类的元数据,以及驻留的Strings和类静态变量。
(2)新生代与老生代共用Java堆空间,永久代单独使用空间。

4、堆空间配置选项:
(1)-Xms:初始堆大小   -Xmx:最大堆大小
  • 默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制。默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制。
  • 上面指定的空间大小为新老生代所共用,默认情况下JVM可以根据应用程序的需要动态的扩展或者收缩。
  • 关注吞吐量及延迟的应用程序应该将-Xms与-Xmx设定为同一值。这是因为无论扩展还是收缩新生代或者老生代空间都要进行Full GC。
(2)-XX:NewSize=<n>[g|m|k]   -XX:MaxNewSize=<n>[g|m|k]  -Xmn<n>[g|m|k]
</div>
分别设置新生代的默认空间大小、最大空间大小,以及若二者相等时使用-Xmn代替。
老生代不需要单独设置,用堆大小减去新生代大小即是老生代的大小

(3)-XX:PermSize=<n>[g|m|k]  -XX:MaxPermSize=<n>[g|m|k]
用于设置永久代的空间大小。

5、计算活跃数据大小
活跃数据是指应用程序处于稳定态(多次执行Full GC以后),Full GC之后Java堆中老年代和永久代所占用的空间大小。

6、Java堆大小计算法则
java堆 -Xms -Xmx 3~4倍Full GC后的老年代空间大小
永久代 -XX:PermSize -XX:MaxPermSize 1.2~1.5倍Full GC后的永久代空间大小
新生代 -Xmn 1~1.5倍Full GC后的老年代空间大小
老生代 java堆大小减去新生代大小 2~3倍Full GC后的老年代空间大小


来自:http://blog.csdn.net/jediael_lu/article/details/44256825