JVM

垃圾回收

2020-12-17  本文已影响0人  那些年搬过的砖

如何查看当前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
上一篇 下一篇

猜你喜欢

热点阅读