Java Jvm 中的垃圾回收机制中的思想与算法 《对Java的分析总结》-四

 

Java中的垃圾回收机制中的思想与算法 《对Java的分析总结》-四


垃圾回收机制 中的思想与算法

  • 引用计算法

 

给对象中添加一个引用计数器,每当一个地方引用它的时候就将计数器加1,当引用失效的时候就将计数器减一;任何时刻计数器为0的对象都是不可能在被使用的

引用计数器的实现也非常简单,只需要为每个对象配备一个整形的计数器即可,但是在JAVA中的垃圾回收机制中没有使用这种算法,是因为其无法处理循环引用的情况

例如 有对象A 和对象 B,对象A中有对象B的引用,对象B中有对象A的引用,此时对象A和对象B的引用计数器都不为0,而在系统中没有其他地方再使用,也就是不存在第三个对象引用了A和B,没有被系统再引用,就应当被回收,但是如果按照引用计数法来讲,这种情况是不能被回收的,所有垃圾回收器无法识别,引起内存泄漏

因此在JAVA语言中,单纯的使用引用计数法器算法实现垃圾回收是不可行的


  • 标记 - 清除算法 查看详情描述


标记-清除算法 是现代垃圾回收算法的思想基础

标记-清除算法有两阶段 
1. 标记阶段:找到所有可访问的对象,做个标记 ,也就是通过根节点,标记所有的根节点开始的可达对象,因此,未被标记的对象就是未被引用的垃圾对象
2. 清除阶段:遍历堆,把未被标记的对象回收


标记-清除算法 产生的最大问题就是空间碎片


  • 复制算法

将可用内存分为两块,from域和to域, 每次只是使用from域,to域则空闲着。当from域内存不够了,开始执行GC操作,这个时候,会把from域存活的对象拷贝到to域,然后直接把from域进行内存清理

内存分配时不用考虑内存碎片等复杂情况,只需要移动堆顶指针,按顺序分配内存即可,实现简单,运行高效


  • 标记 - 压缩算法

分为两个阶段,一个是标记(mark),一个是压缩(compact). 其中标记阶段跟标记-清除算法中的标记阶段是一样的

对于压缩阶段,它的工作就是移动所有的可达对象到堆内存的同一个区域中,使他们紧凑的排列在一起,从而将所有非可达对象释放出来的空闲内存都集中在一起,通过这样的方式来达到减少内存碎片的目的


  • 增量算法

对于大部分的垃圾回收算法而言,在垃圾回收的过程中,应用软件将处于一种 Stop the World 的状态,在这个状态下,应用程序的所有的线程都会挂起,暂停一切正常的工作,等待垃圾回收的完成,如果垃圾回收的时间过长,应用程序就会被挂起很久,将严重影响用户的体验

增量算法,把堆栈分为多个域,用以存放不同寿命的对象,每次仅从一个域中收集垃圾,接着切换到应用程序的线程中,以此反复,直到垃圾收集完毕,在回收垃圾的过程中,间断性的执行了应用程序的代码,所以能减少系统的停顿时间

但是会千万系统吞吐量的下降


  • 分代


这种算法是把堆栈分为两个或多个域,用以存放不同寿命的对象。虚拟机生成的新对象一般放在其中的某个域中。过一段时间,继续存在的对象将获得使用期并转入更长寿命的域中。分代收集器对不同的域使用不同的算法以优化性能。这样可以减少复制对象的时间

 

公众号 我的大前端生涯

早起的年轻人 CSDN认证博客专家 移动开发 项目管理 Java
只要用心去做,每一件事情还是有可能成功的,当然成功是没有界限的,只不过是达到自己心里的那个目标,公众号:我的大前端生涯,一个爱喝茶的程序员,通常会搞搞SpringBoot 、Herbinate、Mybatiys、Android、iOS、Flutter、Vue、小程序等.
©️2020 CSDN 皮肤主题: 代码科技 设计师:Amelia_0503 返回首页