GC 基础

作者: riveraiyanzi | 来源:发表于2017-07-16 01:53 被阅读83次

基本的垃圾回收算法

判断对象是否可被回收

  1. 引用计数法,被零引用的对象可回收。但是很难解决相互引用的问题
  2. 从 gc root 开始搜索,搜索不到的对象可回收。Java 的垃圾回收用的是这种方法。

简要对比三种基本算法

| mark-sweep | mark-compact | copying
--- | :---: | :---: | :---:
速度 | 中等 | 最慢 | 最快
空间开销 | 少(但会堆积碎片) | 少(不堆积碎片) | 通常需要活对象的 2 倍大小(不堆积碎片)

时间开销

mark-sweep: mark 阶段与活对象的数量成正比,sweep 阶段与整堆大小成正比
mark-compact: mark 阶段与活对象的数量成正比,compact 阶段与活对象的大小成正比
copying: 与活对象大小成正比

在分代式假设中,年轻代中的对象在 minor GC 时的存活率应该很低,这样用 copying 算法就是最合算的,因为其时间开销与活对象的大小成正比,如果没多少活对象,它就非常快;而且 young gen 本身应该比较小,就算需要 2 倍空间也只会浪费不太多的空间。

而年老代被 GC 时对象存活率可能会很高,而且假定可用剩余空间不太多,这样 copying 算法就不太合适,于是更可能选用另两种算法,特别是不用移动对象的 mark-sweep 算法。

JVM 内存模型

Java 8 已经没有永久代了。


Java heap memory

eden 满的时候触发 minor gc,升到老年代的对象大于老年代的剩余空间时触发 full gc,或者小于时被HandlePromotionFailure 参数强制 full gc。gc 与非 gc 时间耗时超过了 GCTimeRatio 的限制引发 OOM,调优诸如通过 NewRatio 控制新生代老年代比例,通过 MaxTenuringThreshold 控制进入老年代前生存次数等。


garbage collection process

垃圾回收器

According to JDK 7, there are 5 GC types:

  1. Serial GC
  2. Parallel GC
  3. Parallel Old GC (Parallel Compacting GC)
  4. Concurrent Mark & Sweep GC (or "CMS")
  5. Garbage First (G1) GC

CMS 的 Marking 阶段可细分为 Initial Marking、Concurrent Marking、Remarking。
假设有对象 b

class B {
    A a;
    ...
}

Field a 在被标记(Concurrent Marking)时是指向对象 a1,在并发标记完成前,Field a 转而指向 a2。我们要保证 a2不会被回收(而 a1 可以被错误保留,等待下次 gc)。这就需要再次标记(Remarking)来恢复 a2。如何来做 Remarking,简单地说,就是在 Concurrent Marking 阶段,记下所有改动的 reference,在 Remarking 阶段再 trace 一遍从变动过的 reference 开始的局部 object graph。

types of Java Garbage Collectors serial gc and cms gc

参考资料

  1. http://hllvm.group.iteye.com/group/topic/38223#post-248757
  2. http://javapapers.com/java/how-java-garbage-collection-works/
  3. http://www.cubrid.org/blog/dev-platform/understanding-java-garbage-collection/
  4. http://icyfenix.iteye.com/blog/715301

相关文章

  • GC算法基础

    英文原文:GC Algorithms: Basics译者:有孚译文地址:GC算法基础 在深入GC算法的实现细节之前...

  • 细说JVM(垃圾收集器与内存分配)

    一、基础性的概念 1、Minor GC 和 Full GC 新生代GC(Minor GC):指发生在新生代的垃圾收...

  • JVM垃圾回收理论和实战调优示例

    GC和GC Tuning GC的基础知识 1.什么是垃圾 C语言申请内存:malloc freeC++: new ...

  • 马士兵JVM课程笔记

    GC和GC Tuning GC的基础知识 1.什么是垃圾 C语言申请内存:malloc freeC++: new ...

  • JVM原理以及性能调优

    GC和GC Tuning GC的基础知识 1.什么是垃圾 C语言申请内存:malloc freeC++: new ...

  • GC 基础

    基本的垃圾回收算法 判断对象是否可被回收 引用计数法,被零引用的对象可回收。但是很难解决相互引用的问题 从 gc ...

  • GC基础

    什么是GC GC是垃圾回收,JVM通过GC帮助回收没用的内存。GC主要发生在堆上,偶尔也在方法区或者元数据区。 G...

  • GC基础

    1.什么是垃圾 C语言申请内存:malloc free C++: new delete c/C++ 手动回收内存 ...

  • jvm调优笔记干货

    GC和GC Tuning 原作者:马士兵老师http://mashibing.com GC的基础知识 1.什么是垃...

  • GC日志

    阅读GC日志是处理Java虚拟机内存问题的基础技能。以下两端典型的GC日志: 33.125:[GC [DefNew...

网友评论

    本文标题:GC 基础

    本文链接:https://www.haomeiwen.com/subject/ahftkxtx.html