JDK 监控和故障处理工具总结
1. HotSpot虚拟机的垃圾收集器(图中两个收集器之间有连线,说明它们可以配合使用)
- Serial收集器:新生代收集器,使用停止复制算法,使用一个线程进行GC,串行,其它工作线程暂停。使用-XX:+UseSerialGC可以使用Serial+Serial Old模式运行进行内存回收(这也是虚拟机在Client模式下运行的默认值)
- ParNew收集器:新生代收集器,使用停止复制算法,Serial收集器的多线程版,用多个线程进行GC,并行,其它工作线程暂停,关注缩短垃圾收集时间。使用-XX:+UseParNewGC开关来控制使用ParNew+Serial Old收集器组合收集内存;使用-XX:ParallelGCThreads来设置执行内存回收的线程数。
- Parallel Scavenge 收集器:新生代收集器,使用停止复制算法,关注CPU吞吐量,即运行用户代码的时间/总时间,比如:JVM运行100分钟,其中运行用户代码99分钟,垃 圾收集1分钟,则吞吐量是99%,这种收集器能最高效率的利用CPU,适合运行后台运算(关注缩短垃圾收集时间的收集器,如CMS,等待时间很少,所以适 合用户交互,提高用户体验)。使用-XX:+UseParallelGC开关控制使用Parallel Scavenge+Serial Old收集器组合回收垃圾(这也是在Server模式下的默认值);使用-XX:GCTimeRatio来设置用户执行时间占总时间的比例,默认99,即1%的时间用来进行垃圾回收。使用-XX:MaxGCPauseMillis设置GC的最大停顿时间(这个参数只对Parallel Scavenge有效),用开关参数-XX:+UseAdaptiveSizePolicy可以进行动态控制,如自动调整Eden/Survivor比例,老年代对象年龄,新生代大小等,这个参数在ParNew下没有。
- Serial Old收集器:老年代收集器,单线程收集器,串行,使用标记整理(整理的方法是Sweep(清理)和Compact(压缩),清理是将废弃的对象干掉,只留幸存的对象,压缩是将移动对象,将空间填满保证内存分为2块,一块全是对象,一块空闲)算法,使用单线程进行GC,其它工作线程暂停(注意,在老年代中进行标记整理算法清理,也需要暂停其它线程),在JDK1.5之前,Serial Old收集器与ParallelScavenge搭配使用。
- Parallel Old收集器:老年代收集器,多线程,并行,多线程机制与Parallel Scavenge差不错,使用标记整理(与Serial Old不同,这里的整理是Summary(汇总)和Compact(压缩),汇总的意思就是将幸存的对象复制到预先准备好的区域,而不是像Sweep(清理)那样清理废弃的对象)算法,在Parallel Old执行时,仍然需要暂停其它线程。Parallel Old在多核计算中很有用。Parallel Old出现后(JDK 1.6),与Parallel Scavenge配合有很好的效果,充分体现Parallel Scavenge收集器吞吐量优先的效果。使用-XX:+UseParallelOldGC开关控制使用Parallel Scavenge +Parallel Old组合收集器进行收集。
-
CMS(Concurrent Mark Sweep)收集器:老年代收集器,致力于获取最短回收停顿时间(即缩短垃圾回收的时间),使用标记清除算法,多线程,优点是并发收集(用户线程可以和GC线程同时工作),停顿小。使用-XX:+UseConcMarkSweepGC进行ParNew+CMS+Serial Old进行内存回收,优先使用ParNew+CMS(原因见后面),当用户线程内存不足时,采用备用方案Serial Old收集。
整个过程分为4个步骤:
- 初始标记(CMS initial mark)-------> need "Stop The World"
- 并发标记(CMS concurrent mark)
- 重新标记(CMS remark)------->need "Stop The World"
- 并发清除(CMS concurrent sweep)
-
G1(Garbage-First)是一款面向服务端应用的垃圾收集器。
整个过程分为4个步骤:
- 初始标记(Initial marking)
- 并发标记(Concurrent marking)
- 最终标记(Final marking)
- 筛选回收(Live Data Counting and Evacuation)
并发(Concurrent)和并行(Parallel)的区别:
1.并发是指用户线程与GC线程同时执行(不一定是并行,可能交替,但总体上是在同时执行的),不需要停顿用户线程(其实在CMS中用户线程还是需要停顿的,只是非常短,GC线程在另一个CPU上执行)
2.并行收集是指多个GC线程并行工作,但此时用户线程是暂停的
所以,Serial是串行的,Parallel收集器是并行的,而CMS收集器是并发的.
2.JDK的命令行工具
- jps:虚拟机进程状况工具
JVM Process Status Tool,显示指定系统内所有的HotSpot虚拟机进程
命令格式:
jps [options] [hostid]
- jstat:虚拟机统计信息监视工具
JVM Statistics Monitoring Tool,用于收集HotSpot虚拟机各个方面的运行数据
命令格式:
jstat [ options vmid [interval [s|ms] [count]] ]
- jinfo:Java配置信息工具
Configuration Info for Java,显示虚拟机配置信息
命令格式:
jinfo [ options] pid
- jmap:Java内存影像工具
Memory Map for Java,生成虚拟机的内存转储快照(heapdump文件)
命令格式:
jmap [ options] vmid jmap -dump:live,format=b,file=dump.hprof sid
- jhat:虚拟机堆转储快照分析工具
JVM Heap Dump Browser,用于分析heapdump文件,他会建立一个HTTP/HTML服务器,让用户可以在浏览器上查看分析结果 - jstack:Java堆栈跟踪工具
Stack Trace for Java,显示虚拟机的线程快照
命令格式:
jstack [ options] vmid