【JAVA提升】- GC算法及垃圾回收器

2020-05-06  本文已影响0人  我不是李小龙

GC算法及收集器

1 GC的概念

垃圾收集 Garbage Collection 通常被称为“GC”,它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了。

jvm 中,程序计数器、虚拟机栈、本地方法栈都是线程私有的,它们随线程而生,随线程而灭。栈帧随着方法的进入和退出做入栈和出栈操作,实现了自动的内存清理。
因此,我们的内存垃圾回收主要集中于 java 堆和方法区中,在程序运行期间,这部分内存的分配和使用都是动态的.

2 对象存活判断

判断对象是否存活一般有两种方式:

在java中,可作为GC Roots的对象有:

1.虚拟机栈(栈帧中的本地变量表)中引用的对象;

2.方法区中的类静态属性引用的对象;

3.方法区中常量引用的对象;

4.本地方法栈中JNI(即一般说的Native方法)中引用的对象

关于GC Roots具体说明(建议看下)

3 垃圾收集算法

3.1 标记清除(Mark-Sweep)

mark-sweep.jpg

3.2 复制(Copying)

copying.jpg

3.3 标记整理(Mark-Compact)

复制收集算法在对象存活率较高时就要执行较多的复制操作,效率将会变低。更关键的是,如果不想浪费50%的空间,就需要有额外的空间进行分配担保,
以应对被使用的内存中所有对象都100%存活的极端情况,所以在老年代一般不能直接选用这种算法。

根据老年代的特点,有人提出了另外一种“标记-整理”(Mark-Compact)算法,标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象进行清理,
而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存

mark-compact.jpg

3.4 分代收集算法(Generational Collection)

GC分代的基于一个假设:绝大部分对象的生命周期都非常短暂,存活时间短。

“分代收集”(Generational Collection)算法,把Java堆分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的收集算法。

4 垃圾收器及常用组合

参考:常见JVM垃圾收集器一览


参考链接

上一篇 下一篇

猜你喜欢

热点阅读