jvm学习记录:GC

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/about4years/article/details/77412993

垃圾收集 Garbage Collection 通常被称为“GC”。

1.GC分哪几种?

讨论这个问题之前,我们需要清楚堆的分区

  • 新生代(New Generation)

    大多数情况下新对象都被分配在新生代中,新生代由Eden Space和两块相同大小的Survivor Space组成,默认比例通常是8:1:1(90%的对象都是朝生夕死,进不了survivor区),之所以这样分区是为了后面会讲到的复制算法服务。

  • 旧生代(Old Generation/Tenuring Generation)

    在新生代中存活时间较久的对象将会被转入旧生代,旧生代进行垃圾收集的频率没有新生代高。

所以很容易想到,不同的GC种类,会对应不同的分区,一共有3种GC,Minor、Major、和 Full GC ,顾名思义,Minor GC针对新生代,Major GC针对老生代,Full GC则是一起清理,其实大多数情况下后两种 GC 分离是不太可能的。

为什么会有不同分区呢?
因为这样我们就可以有针对性的实行GC算法,提高效率。当新生代发生GC(Minor GC)时,会将存活的对象移动到S0内存区域,并清空Eden区域,当再次发生Minor GC时,将Eden和S0中存活的对象移动到S1内存区域。会有一个阙值,累加到一定值,这个对象被移到旧生代。

2.如何去判断哪些对象是垃圾?

a. 很容易想到的一种方法就是所谓的引用计数器,一个对象有一个引用,那么该计数器+1,简单效率高,但是jvm并没有使用该算法,因为有一种情况计数器是不生效的,我们假定有2个类,A,B。A中有一个成员变量是B类型的,B有一个成员变量是A类型的,现在实例化A,B两个类,引用计数器分别+1,并且将B的这个对象赋值给A中的成员变量,B的成员变量也被赋值了这个实例化的A对象,那么现在A,B的对象引用计数器又变成了2。现在我们不再使用这2个对象了,理所当然将A,B置空,引用计数器各-1,问题来了,目前引用计数器并不是0,而是1,GC不会来回收,然而我们已经无法使用A,B这2个对象了。

b.可达性分析算法,从”根”节点开始向下搜索,到达不了的对象,证明此对象不可用,等待回收。搜索所走过的路径称为引用链(Reference Chain)。何谓根节点:

  • 虚拟机栈中引用的对象
  • 方法区常量引用的对象
  • 方法区类静态变量引用的对象
  • 本地方法(native)引用的对象

3.垃圾收集算法?
  • “标记-清除”(Mark-Sweep)算法,如它的名字一样,算法分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象。之所以说它是最基础的收集算法,是因为后续的收集算法都是基于这种思路并对其缺点进行改进而得到的。

    它的主要缺点有两个:一个是效率问题,标记和清除过程的效率都不高;另外一个是空间问题,标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致,当程序在以后的运行过程中需要分配较大对象时无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。
    这里写图片描述

  • 复制算法
    “复制”(Copying)的收集算法,它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。

    这样使得每次都是对其中的一块进行内存回收,内存分配时也就不用考虑内存碎片等复杂情况,只要移动堆顶指针,按顺序分配内存即可,实现简单,运行高效。只是这种算法的代价是将内存缩小为原来的一半,持续复制长生存期的对象则导致效率降低。

    这里写图片描述


参考:
http://blog.csdn.net/timheath/article/details/53055193
http://blog.csdn.net/iter_zc/article/details/41746265
http://coolshell.cn/articles/11541.html
http://www.cnblogs.com/ityouknow/p/5614961.html
http://www.cnblogs.com/ggjucheng/p/3977384.html
http://blog.hesey.net/2011/04/introduction-to-java-virtual-machine.html

猜你喜欢

转载自blog.csdn.net/about4years/article/details/77412993