zoukankan      html  css  js  c++  java
  • 实战java虚拟机(二)——垃圾回收算法

    前言


    垃圾回收是Java体系最重要的组成部分之一,和C/C++不同,Java虚拟机提供了全自动的内存管理方案,尽量减少了我们在内存资源管理方面的工作量,但是这套方案也并不完美,因此我们也需要深入学习垃圾回收的算法,在工作中遇到内存溢出等问题时也容易更快找到问题所在

    一、引用计数法


    引用计数法是最古老的垃圾收集算法,它的实现非常简单,只需要为每个对象配备一个整型计数器即可,当对象被引用时,计数器+1,引用失效时计数器-1.

    显而易见,这种方式有着两个非常严重的问题:

    1.无法处理循环引用,如果对象A,B相互引用,且不存在第三个对象引用了A或B,按道理AB两个对象是垃圾对象需要被回收,但是AB之间的相互引用导致计数器永远不为0,无法被回收

    2.在每次引用产生和消除的时候,需要额外的操作对计数器做加减法,对性能会存在一定影响

    因此,Java虚拟机没有选择此算法作为回收算法

    二、标记清除法


    标记清除法是现代垃圾回收算法的思想基础,它分为两个阶段:标记阶段和清除阶段。一种简单的具体实现方法如下

    在标记阶段,通过根节点标记所有从根节点开始的可达对象,在清除阶段,清除所有未被标记的对象。

    显然,这种方式很容易产生空间碎片,回收后的空间不连续,后续空间分配时,尤其是大对象的分配,会导致效率大大降低,这也是这种算法的最大缺点。

    三、复制算法


    该算法的核心思想是:将原有的内存空间分为两块,每次只使用其中一块,进行垃圾回收时,将正在使用的内存中的存活对象复制到未使用的内存块中,再清楚正在使用的内存块中的对象,完成垃圾回收。如果系统中的垃圾对象较多,算法需要复制的存活对象数量就较少,因此,在真正需要垃圾回收的时候,复制算法的效率是很高的,而且对象是统一复制到新的内存空间,确保回收后的内存空间是没有碎片的,但是这么做的代价也是很高的,系统的内存使用率将最高只有50%

    四、标记压缩法


    标记压缩法是一种老年代的回收算法,它在标记清除法上做了一些优化。与标记清除法相同,它有标记和清除阶段,不同的是,它不是简单的标记存活对象,而是将存活对象压缩到内存的一端,然后清理边界外的所有空间,这种方式既可以避免了碎片的产生,对内存的利用率也较高。

    五、分代算法


    分代算法基于生命区间长短划分成两个部分,根据每块内存区间的特点使用不同的算法,提高垃圾回收的效率。一般在新生代的是复制算法,老年代中是标记压缩/标记清除法。

    六、分区算法


    分区算法是将整个堆空间划分成连续不同的小空间,每个小区间独立使用回收

  • 相关阅读:
    求求你规范下你的代码风格
    为啥用ip不可以访问知乎,而百度却可以?
    漫画:htts是如何保证一台主机把数据安全发给另一台主机
    如何从亿量级中判断一个数是否存在?
    广播路由算法 :我是如何优雅着把悄悄话带给其他人的
    什么?你不知道0.0.0.0和255.255.255.255这两个地址是干嘛的?
    一篇文章带你学会Linux三剑客之一:awk
    你真的了解 i++, ++i 和 i+++++i 以及 i+++i++ 吗?
    通俗易懂讲解TCP流量控制机制,了解一下
    一文读懂拥塞控制
  • 原文地址:https://www.cnblogs.com/gtblog/p/11460532.html
Copyright © 2011-2022 走看看