目录:
1.常用JVM调优参数
2. GC日志
3.常用JVM调优工具
3.1 JConsole
3.2 JVisualVM
3.3 JStat
3.4 JMap
4.通过Thread Dump诊断JVM性能
1.常用JVM调优参数
- -XX:+PrintGCDetails 打印详细垃圾回收信息
- -Xms 为Heap区域的初始值
- -Xmx 为Heap区域的最大值,线上环境需要与-Xmx设置为一致,以免JVM堆内存使用达到Xmx值,并且进行垃圾回收后,会收缩堆大小至Xms值
- -Xss(或-ss) 线程栈大小,JDK1.5之前默认为256K,之后是1M
- -XX:PermSize与-XX:MaxPermSize 方法区(永久代)的初始大小和最大值(JDK1.7以后更改为-XX:MetaspaceSize与-XX:MaxMetaspaceSize)
- -XX:NewRatio 老年代与新生代比率,默认为2:1
- -XX:SurvivorRatio Eden与Survivor的占用大小比例,默认为8,如上图所示
- -Xmn 新生代区大小
- -XX:MaxTenuringThreshold 对象在Survivor区熬过Minor GC的年龄阈值,默认是15,一旦达到,就会被复制到年老代区
- -XX:+HeapDumpOnOutOfMemoryError 当JVM发生内存溢出时,Dump出当前的内存堆转储快照,以便分析用
2.GC日志
1.Minor GC:
2.Full GC:
3.常用JVM调优工具
3.1 JConsole
JConsole是JDK自带的JVM性能分析的图形化工具,可以查看当前应用的对象引用、内存、CPU使用情况、线程运行情况(阻塞、等待等)。
3.2 JVisualVM
一款商用的JVM性能分析的图形化工具,JConsole的增强版。
3.3 JStat
JDK自带的命令行工具,传入进程ID,可以得到GC的详细信息(包括内存各区的空间占用情况,Minor GC和Full GC分别的发生次数和累计时间)等。
详见JStat使用
3.4 JMap
JDK自带的命令行工具,传入进程ID,可以得到JVM内存各区的详细空间占用情况,以及所加载的类对象数目和对象的内存占用情况。
详见JMap使用
4.通过Thread Dump诊断JVM性能
- Thread Dump是JVM中所有Java线程的快照,此文件中包含各线程的堆栈跟踪信息、线程名、线程ID、线程状态(Running,Blocked,DeadLock等)、以及线程调用的方法堆栈信息。
- 通过Thread Dump可以诊断一下问题:
- 通过各线程的资源利用情况,结合Thread Dump,诊断代码bug,死锁,线程Blocked等。
- 查找内存泄漏(由于Minor GC相当快,应用程序并不会受到影响,Full GC可能会造成应用卡顿、超时;这时GC Task Thread可能会占用较高的CPU资源)。
详见性能分析之Java Thread Dump,三个实例演示Java Thread Dump
结语:本节向大家介绍了JVM调优方案,下节将和大家一块来学习JVM类加载机制。