如何查看当前JVM使用的垃圾回收器?
java -XX:+PrintCommandLineFlags -version
如何指定使用CMS回收?
-XX:+UseConcMarkSweepGC
如何打印回收日志?
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:/Users/dbq/Documents/git/gctest/logs/gc.log
垃圾回收过程
CMS垃圾回收的6个重要阶段
1、initial-mark 初始标记(CMS的第一个STW阶段),标记GC Root直接引用的对象,GC Root直接引用的对象不多,所以很快。
2、concurrent-mark 并发标记阶段,由第一阶段标记过的对象出发,所有可达的对象都在本阶段标记。
3、concurrent-preclean 并发预清理阶段,也是一个并发执行的阶段。在本阶段,会查找前一阶段执行过程中,从新生代晋升或新分配或被更新的对象。通过并发地重新扫描这些对象,预清理阶段可以减少下一个stop-the-world 重新标记阶段的工作量。
4、concurrent-abortable-preclean 并发可中止的预清理阶段。这个阶段其实跟上一个阶段做的东西一样,也是为了减少下一个STW重新标记阶段的工作量。增加这一阶段是为了让我们可以控制这个阶段的结束时机,比如扫描多长时间(默认5秒)或者Eden区使用占比达到期望比例(默认50%)就结束本阶段。
5、remark 重标记阶段(CMS的第二个STW阶段),暂停所有用户线程,从GC Root开始重新扫描整堆,标记存活的对象。需要注意的是,虽然CMS只回收老年代的垃圾对象,但是这个阶段依然需要扫描新生代,因为很多GC Root都在新生代,而这些GC Root指向的对象又在老年代,这称为“跨代引用”。
6、concurrent-sweep ,并发清理。
CMS的一次回收详细过程
日志分析
在线分析工具https://gceasy.io/
image.png