1.一般的Java项目不需要JVM调优
(1)JVM本身就是为这种低延时高并发大吞吐的服务设计和优化的
(2)往往更偏重于应用服务本身的调优
(3)一般项目加个xms和xmx参数就够了
2.JVM调优6大步骤
(1)JVM内存的系统级的调优主要的目的是减少GC的频率和Full GC的次数
(2)JVM性能调优方法和步骤:
<1>监控GC的状态
1.1.使用各种JVM工具,查看当前日志,分析当前JVM参数设置
1.2.分析当前堆内存快照和gc日志,根据实际的各区域内存划分和GC执行时间,觉得是否进行优化
<2>生成堆的dump文件
2.1.通过JMX的MBean生成当前的Heap信息,大小为一个3G(整个堆的大小)的hprof文件
2.2.如果没有启动JMX可以通过Java的jmap命令来生成该文件
<3>分析dump文件
3.1.打开这个3G的堆信息文件,一般的Window系统没有这么大的内存,必须借助高配置的Linux
3.2.几种工具打开该文件:
3.2.1.Visual VM、IBM HeapAnalyzer、JDK 自带的Hprof工具
3.2.2.Mat(Eclipse专门的静态内存分析工具)推荐使用
<4>分析结果,判断是否需要优化
4.1.如果各项参数设置合理,系统没有超时日志出现,GC频率不高,GC耗时不高,那么没有必要进行GC优化
4.2.如果GC时间超过1-3秒,或者频繁GC,则必须优化
4.3.如果满足下面的指标,则一般不需要进行GC:
4.3.1.Minor GC执行时间不到50ms;
4.3.2.Minor GC执行不频繁,约10秒一次;
4.3.3.Full GC执行时间不到1s;
4.3.4.Full GC执行频率不算频繁,不低于10分钟1次;
<5>调整GC类型和内存分配
5.1.若内存分配过大或过小,或者采用的GC收集器比较慢,则应该优先调整这些参数
<6>不断的分析和调整
6.1.通过不断的试验和试错,分析并找到最合适的参数
6.2.如果找到了最合适的参数,则将这些参数应用到所有服务器
3.JVM参数优化步流程(仅用于参考)
(1)针对JVM堆的设置,一般可以通过-Xms -Xmx限定其最小、最大值
<1>为了防止垃圾收集器在最小、最大之间收缩堆而产生额外的时间
<2>通常把最大、最小设置为相同的值
(2)年轻代和年老代将根据默认的比例(1:2)分配堆内存
<1>通过调整二者之间的比率NewRadio来调整二者之间的大小,也可以针对回收代
<2>为了防止年轻代的堆收缩,会把-XX:newSize -XX:MaxNewSize设置为同样大小
(3)年轻代和年老代设置在抉择时应该根据以下两点:
<1>本着Full GC尽量少的原则,让年老代尽量缓存常用对象,JVM的默认比例1:2也是这个道
<2>给年老代至少预留1/3的增长空间
4.JVM参数设置依据:
(1)堆设置
-Xms:初始堆大小
-Xmx:最大堆大小
-XX:NewSize=n:设置年轻代大小
-XX:NewRatio=n:设置年轻代和年老代的比值
<1>如:为3,表示年轻代与年老代比值为1:3
<2>年轻代占整个年轻代年老代和的1/4
-XX:SurvivorRatio=n:年轻代中Eden区与两个Survivor区的比值
<1>注意Survivor区有两个
<2>如:3,表示Eden:Survivor=3:2,
<3>一个Survivor区占整个年轻代的1/5
-XX:MaxPermSize=n:设置持久代大小
(2)以Tomcat服务启动,对于参数设置,在tomcat的bin目录下
<1>window系统在catalina.bat中设置
<2>Linux系统在catalina.sh中设置
(3)在eclipse中设置JVM启动参数,在Run菜单下的“run configurations”配置