Java GC 中的一些概念

目录 [−]

  1. GC Root
  2. mark-sweep-compact
  3. 几种垃圾回收器简介
  4. CMS回收过程
  5. G1回收过程
  6. Stop-The-World Event
  7. 垃圾回收器的JVM参数
  8. 参考

本文整理了JVM GC中的一些概念。 正文并没有一个主线,只是将GC一些不清楚的,其它文章中讲解的不清楚的地方记录下来。

GC Root

在JVM垃圾回收的很多文章中,都会提到垃圾回收不是通过计数器的方式找出不再使用的对象,而是通过Root找引用,那么不是Root或者不被Root直接或者间接访问的对象都会被回收掉。 那么哪些对象是GC Root呢?

以下对象被标记成Root:

  • Class: 由系统类加载器(system class loader)加载的类,它们不能被卸载。 由自定义的类加载器加载的类不是Root,除非相应的java.lang.Class的实例是其它类型的Root
  • Thread: 活着的线程
  • Stack Local:Java方法的参数或者本地变量
  • JNI Local: JNI方法的参数或者本地变量
  • Monitor Used:同步用的监控器
  • Held by JVM: JVM自己持有的对象,比如系统类加载器,一些异常等

mark-sweep-compact

标记-清理-压缩算法。Serial GC (-XX:+UseSerialGC)在老年代使用的算法。

  1. 第一步是标记在老年代的存活对象
  2. 接着从头检查对,只保留存活对象(sweep).
  3. 最后一步整理对象,将存活对象整理到连续的空间,这样堆就可以分成两部分,一部分是存活对象使用的内存,一部分是未使用的内存

几种垃圾回收器简介

  • Serial GC:实际的server上不会使用。年轻代的回收简单,年老代使用mark-sweep-compact算法,单线程。
  • Parallel GC: 多线程,也叫"throughput GC"
  • Parallel Old GC (Parallel Compacting GC):与Parallel GC不同,它只应用于年老代,使用mark – summary – compaction算法。
  • Concurrent Mark & Sweep GC (or "CMS"):使用initial Mark-concurrent Mark-Remark-Concurrent Sweep-reset算法。只有初始化Mark和再Mark时会STW.只有初始化Mark才单线程。无压缩
  • Garbage First (G1) GC:G1将堆空间划分成了互相独立的区块。每块区域既有可能属于O区、也有可能是Y区。块大小1Mb ~32Mb,大约2014块。

CMS回收过程

  1. Initial Mark(Stop the World Event):将年老代的对象标记成可达的,这些对象可以被年轻代的对象访问。时间很短。
  2. Concurrent Marking:标记年老代的对象。包括上面marked的对象和年老代的对象。不会STW
  3. Remark(Stop the World Event):重新标记在上一步骤中新的对象
  4. Concurrent Sweep: 回收不可达的对象
  5. reset:清理数据结构,准备下一次回收

G1回收过程

  1. Initial Mark(Stop the World Event):young gc时执行,标记survivor 区块(root regions)中准备移动到old区块的对象
  2. Root Region Scanning: Scan survivor regions for references into the old generation. This happens while the application continues to run. The phase must be completed before a young GC can occur.
  3. Concurrent Marking:Find live objects over the entire heap. This happens while the application is running. This phase can be interrupted by young generation garbage collections.
  4. Remark(Stop the World Event):Completes the marking of live object in the heap. Uses an algorithm called snapshot-at-the-beginning (SATB) which is much faster than what was used in the CMS collector.
  5. Cleanup(Stop the World Event and Concurrent):
  6. Copying(Stop the World Event):

Stop-The-World Event

在垃圾回收过程中需要将应用程序的线程暂停称之为Stop-The-World Event(STW)。

垃圾回收器的JVM参数

Young collector
Old collector
JVM option
Serial (DefNew)
Serial Mark-Sweep-Compact
-XX:+UseSerialGC
Parallel scavenge (PSYoungGen)
Serial Mark-Sweep-Compact (PSOldGen)
-XX:+UseParallelGC
Parallel scavenge (PSYoungGen)
Parallel Mark-Sweep-Compact (ParOldGen)
-XX:+UseParallelOldGC
Serial (DefNew)
Concurrent Mark Sweep
-XX:+UseConcMarkSweepGC
-XX:-UseParNewGC
Parallel (ParNew)
Concurrent Mark Sweep
-XX:+UseConcMarkSweepGC
-XX:+UseParNewGC
G1
-XX:+UseG1GC

其中的DefNew表示的是DefNewGenerationdefault new generation
原本HotSpot VM里没有并行GC,当时就只有NewGeneration;后来准备要加入young gen的并行GC,就把原本的NewGeneration改名为DefNewGeneration,然后把新加的并行版叫做ParNewGeneration

参考

  1. https://www.yourkit.com/docs/java/help/gc_roots.jsp
  2. http://www.cubrid.org/blog/dev-platform/understanding-java-garbage-collection/
  3. http://www.oracle.com/technetwork/tutorials/tutorials-1876574.html
  4. http://mechanical-sympathy.blogspot.jp/2013/07/java-garbage-collection-distilled.html
  5. http://www.oracle.com/technetwork/articles/java/vmoptions-jsp-140102.html
  6. http://blog.sokolenko.me/2014/11/javavm-options-production.html