本文主要是介绍Java垃圾处理机制学习总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、垃圾收集(Garbage Collection)
在研究Java垃圾回收及至时候,考虑哪些内存需要收回?什么时间收回?如何收回?
Java虚拟机堆中存放着几乎所有的Java实例对象,如何判断众多对象中哪些对象已经失效?
-引用计数法:给对象添加一个引用计数器,每一次被引用时,计数器加1;每一次引用失效时,计数器减1;任何时候计数器都为0的对象就是不能被访问的对象。(Java中并没有 采用这种方法,因为该方法很难解决对象之间互相引用的问题)。
-根搜索算法:GC Root 到对象之间没有可以连接的路径时,这些对象是不可用的。
对象的消亡需要经过两次的标记,上面判断失效是第一次,对象的最后一次救赎在F-Queue中。
在F-Queue中的对象如果在被回收之前与引用链上的任何一个对象建立联系,那么它就会被从F-Queue中移出。
二、垃圾回收的算法:
(1)标记-清除算法
第一步:标记处出所有需要清除的对象;第二步:统一收掉所有被标记的对象。
缺点:1、效率不高。2、空间利用率不好,清除后会产生很多不连续的内存区域。这样会导致当程序需要创建大对象进行程序执行时,找不到足够的空间,从而又一次触发垃圾回收动作。
(2)复制算法
将内存按容量分为两部分,每次只用其中一块,当这一块用完了,就将还存活的对象复制到另一块上,然后再把使用过的内存空间清理掉,无内存碎片问题。只是将内存缩减一半,代价有点高~
(3)标记-整理算法
首先是标记,然后将所有存活的对象向一端移动,最后直接清理掉端边界以外的所有内存。
(4)分析收集算法
内存划分块,个新生代和老块中的对象回收仍需要标记-清除算法。
这篇关于Java垃圾处理机制学习总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!