性能调优包含多个层次,比如:架构调优、代码调优、JVM调优、数据库调优、操作系统调优等。 架构调优和代码调优是JVM调优的基础,其中架构调优是对系统影响最大的。
实际上,优先架构调优和代码调优,JVM优化是不得已的手段,大多数的Java应用不需要进行JVM优化
先介绍三个概念:
吞吐量:用户代码执行时间/(用户代码执行时间+GC执行时间)。
暂停时间:执行垃圾收集时,程序的工作线程被暂停的时间;
内存占用:java堆区所占的内存大小
我们进行JVM调优的目的可以有很多,比如说:
- Heap 内存使用率 <= 70%;
- Old generation内存使用率<= 70%;
- avgpause <= 1秒;
- Full gc 次数0 或 avg pause interval >= 24小时 ;
-Xms 堆初始大小
-Xmx 最大堆大小
-Xmn 新生代大小
-XX:NewRatio 新生代和老年代的比例
-XX:+PrintGCDetails 查看详细的GC处理日志
-XX:+HeapDumpOnOutOfMemoryError 出现异常时输出堆内信息,这个一般要配合: -XX:HeapDumpPath=******使用,指定输出路径
比如:-Xms5M -Xmx5M -Xmn1M -XX:SurvivorRatio=8 -XX:HeapDumpPath=/usr/local/gc.hprof
其他常有的还有-Xss 设置栈大小,如果不设置,默认值为1M
1.堆设置:
-Xms 堆初始大小
-Xmx 最大堆大小
通常设置为相同的值,避免运行时要不断扩展JVM内存
2.新生代设置
-Xmn
避免新生代设置过小,当新生代设置过小时,会带来两个问题:一是minor GC次数频繁,二是可能导致 minor GC对象直接进老年代(老年代对象太多会触发Full GC)
避免新生代设置过大,当新生代设置过大时,会带来两个问题:一是老年代变小,可能导致Full GC频繁执行;二是 minor GC 执行回收的时间大幅度增加。
3.老年代设置
一般吞吐量优先的应用都有一个较大的年轻代和一个较小的老年代。原因是,这样可以尽可能回收掉大部分短期对象,减少中期的对象,而老年代尽可能存放长期存活对象
4.方法区设置
基于jdk1.7版本,永久代:参数-XX:PermSize和-XX:MaxPermSize;
基于jdk1.8版本,元空间:参数 -XX:MetaspaceSize和-XX:MaxMetaspaceSize;
通常设置为相同的值,避免运行时要不断扩展