目录 [−]
本文整理了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)在老年代使用的算法。
- 第一步是标记在老年代的存活对象
- 接着从头检查对,只保留存活对象(sweep).
- 最后一步整理对象,将存活对象整理到连续的空间,这样堆就可以分成两部分,一部分是存活对象使用的内存,一部分是未使用的内存
几种垃圾回收器简介
- 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回收过程
- Initial Mark(Stop the World Event):将年老代的对象标记成可达的,这些对象可以被年轻代的对象访问。时间很短。
- Concurrent Marking:标记年老代的对象。包括上面marked的对象和年老代的对象。不会STW
- Remark(Stop the World Event):重新标记在上一步骤中新的对象
- Concurrent Sweep: 回收不可达的对象
- reset:清理数据结构,准备下一次回收
G1回收过程
- Initial Mark(Stop the World Event):young gc时执行,标记survivor 区块(root regions)中准备移动到old区块的对象
- 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.
- 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.
- 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.
- Cleanup(Stop the World Event and Concurrent):
- 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表示的是DefNewGeneration
即default new generation
。
原本HotSpot VM里没有并行GC,当时就只有NewGeneration;后来准备要加入young gen的并行GC,就把原本的NewGeneration改名为DefNewGeneration,然后把新加的并行版叫做ParNewGeneration
。
参考
- https://www.yourkit.com/docs/java/help/gc_roots.jsp
- http://www.cubrid.org/blog/dev-platform/understanding-java-garbage-collection/
- http://www.oracle.com/technetwork/tutorials/tutorials-1876574.html
- http://mechanical-sympathy.blogspot.jp/2013/07/java-garbage-collection-distilled.html
- http://www.oracle.com/technetwork/articles/java/vmoptions-jsp-140102.html
- http://blog.sokolenko.me/2014/11/javavm-options-production.html