美文网首页
Java垃圾回收机制(GC)

Java垃圾回收机制(GC)

作者: 林祖朋 | 来源:发表于2018-05-04 15:39 被阅读20次

    垃圾回收的时间:

    由于是否进行主GC由JVM根据系统环境决定,而系统环境在不断的变化当中,所以主GC的运行具有不确定性,无法预计它何时必然出现,但可以确定的是对一个长期运行的应用来说,其主GC是反复进行的。 System.gc(), Runtime.getRuntime().gc() 这两种方法用于显示通知JVM可以进行一次垃圾回收,但垃圾回收机制具体在什么时间运行是无法预知的。
    意思是 通知回收之后 不一定被回收 。而且这个方法对资源消耗较大尽量不要显式去调用这个方法。

    JVM 在进行垃圾回收之前,需要判断哪些对象是需要回收的

    引用计数算法

    给对象中添加一个的引用计数器, 每当有一个地方 引用它时, 计数器值就加 1; 当引用失效时, 计数器值就减 1; 任何时刻计数器为 0 的 对象 就是不可能再被使用的。
    弊端:很难解决对象之间相互循环引用的问题。

    可达性分析算法

    通过一系列的称为 GC Roots 的对象作为起始点,从这些节点开始向下搜索。搜索所有走过的路径称为引用链,当一个对象到 GC Roots 对象没有任何引用链相连,则证明此对象是不可用的。
    PS:可作为 GC Roots 的对象包括下面几种:
    虚拟机栈(栈帧中的本地变量表)中引用的对象
    方法区中类静态属性引用的对象
    方法区中常量引用的对象
    本地方法中 JNI 引用的对象

    通过垃圾收集算法进行垃圾回收

    标记清除算法:

    首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。

    复制算法:

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

    标记整理算法:

    标记过程仍然与标记清除算法一样,但是后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。

    分代收集算法:

    根据对象生活周期的不同将内存划分为几块,一般是把 Java 堆分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的算法。在新生代中,每次垃圾收集时都发现有大批对象死去,只有少量存活,那就选用复制算法,只需要付出少量存活对象的复制成本就可以完成收集。在老年代中,因为对象存活率高、没有额外空间对它进行分配担保,就必须使用标记清理或标记整理算法来 实现。

    相关文章

      网友评论

          本文标题:Java垃圾回收机制(GC)

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