垃圾回收
垃圾回收(Garbage Collection, GC). 垃圾回收的主要目的是清除不再使用的对象,自动释放内存.
GC 是如何判断对象是否可以被回收的呢?
为了判断对象是否存活,JVM 引入了GC Roots . 如果一个对象与 GC Roots之间没有直接或间接的引用关系. 比如某个失去任何引用的对象,或者两个相互环岛状循环引用的对象等. 判决这些对象 “死缓”,是可以被回收的.
什么对象可以作为GC Roots 呢?
比如: 类静态属性中引用的对象,常量引用的对象, 虚拟机栈引用的对象, 本地方法栈中引用的对象等.
垃圾回收的相关算法
“标记-清除算法”
该算法会从每个 GC Roots 出发, 依次标记有引用关系的对象, 最后将没有被标记的对象清除. 但是这种算法会带来大量的空间碎片,导致需要分配一个较大连续空间时容易触发 FGC .
“标记-整理算法”
该算法类似计算机的磁盘整理,首先会从GC Roots 触发标记存活的对象,然后将存活对象整理到内存空间的一端,形成了连续的已使用空间,最后把已使用空间之外的部分全部清理掉,这样就不会产生空间碎片的问题.
"Mark - Copy " 算法
为了能够并行地标记和整理将空间分为两块,每次只激活其中一块,垃圾回收时只需要把存活的对象复制到另一块未激活空间上,将未激活空间标记为已激活,将已激活空间标记为未激活,然后清除原空间中的原对象. 堆内存空间氛围较大的 Eden 和两块较小的 Survivor, 每次只使用Eden 和 Survivor 区的一块,这种情形下的"Mark- Copy"减少了内存空间的浪费,"Mark-Copy"现作为主流的YGC算法进行新生代的垃圾回收.</