Java HotSpot JVM垃圾回收

一、J2SE 5.0 HotSpot

JVM堆内存包括:年轻代、老年代、永久代

年轻代包括:Eden区、Survivor区

Survivor区包括:From区、To区

1. 年轻代GC(young gc/minor gc)

① Eden区存活的对象拷贝至To(From)区,清空Eden区,若To(From)区不足则直接拷贝至老年代

② From区存活对象拷贝至老年代,清空From(To)区

③ 1-2步循环From区与To区轮换执行

2. 老年代GC(full gc/major gc)

当老年代对象大小达到占总大小的一定比例(参数控制),进行老年代gc,清空老年代中非存活的对象

3. 串行gc、并行gc

串行gc:jvm默认即串行gc,也可通过参数 -XX:+UseSerialGC指定。

并行gc:充分利用多核cpu,多线程进行gc,通过参数-XX:+UseParallelGC指定。

并行压缩gc(Parallel Compacting Collector):基本已替代并行gc,为老年代gc使用了新算法,减少停顿时间,适用于对停顿时间有严格约束的应用。可通过参数-XX:+UseParallelOldGC指定。

4. 标记清除gc(CMS gc)

针对较大的堆内存情景,进一步减少停顿时间。可通过参数-XX:+UseConcMarkSweepGC 指定。

分为如下几个阶段:

初始标记(init mark):停顿所有线程,标识出初始存活对象的集合。耗时较短,约70ms

② 标记(mark):从初始标记的对象集合中标记出所有活跃的对象。耗时较长,约1.64s

③ 预清除(preclean):预先清除。耗时较短,约10ms

④ 可中断的预清除(abortable-preclean):可中断的预清除,耗时较长,约5s

⑤ 重标记(remark):停顿所有线程,重新标记在标记(mark)阶段中修改过的对象,获得真实的所有活跃的对象。耗时较短,约70ms

⑥ 交换(sweep):交换,耗时较长,约3.8s

⑦ 重置(reset):重置,耗时较短,约20ms

gc时机:cms根据之前gc时机的统计而定,也根据老年代占用率阈值而定,根据参数– XX:CMSInitiatingOccupancyFraction=n,默认值为68

增量模式:在年轻代gc之间穿插老年代gc,适用于单核或双核处理器,可通过–XX:+CMSIncrementalMode指定。

5. 常用gc选项

–XX:+PrintGC 打印gc信息

–XX:+PrintGCDetails 打印gc详细信息

-XX:+PrintHeapAtGC 打印gc时的堆大小

–XX:+PrintGCTimeStamps 打印gc时间戳

-XX+UseCMSCompactAtFullCollection 每次full gc时进行压缩

-XX:CMSFullGCsBeforeCompaction=n 在n次full gc后进行压缩

–XX:ParallelGCThreads=n 并行gc线程数

原文地址:https://www.cnblogs.com/juzii/p/6635221.html