Java垃圾处理机制学习总结

来源:互联网 发布:php app接口开发 框架 编辑:程序博客网 时间:2024/05/20 03:47

一、垃圾收集(Garbage Collection)

在研究Java垃圾回收及至时候,考虑哪些内存需要收回?什么时间收回?如何收回?

Java虚拟机堆中存放着几乎所有的Java实例对象,如何判断众多对象中哪些对象已经失效?

-引用计数法:给对象添加一个引用计数器,每一次被引用时,计数器加1;每一次引用失效时,计数器减1;任何时候计数器都为0的对象就是不能被访问的对象。(Java中并没有  采用这种方法,因为该方法很难解决对象之间互相引用的问题)。

-根搜索算法:GC Root 到对象之间没有可以连接的路径时,这些对象是不可用的。

对象的消亡需要经过两次的标记,上面判断失效是第一次,对象的最后一次救赎在F-Queue中。

在F-Queue中的对象如果在被回收之前与引用链上的任何一个对象建立联系,那么它就会被从F-Queue中移出。

二、垃圾回收的算法:

(1)标记-清除算法

第一步:标记处出所有需要清除的对象;第二步:统一收掉所有被标记的对象。

缺点:1、效率不高。2、空间利用率不好,清除后会产生很多不连续的内存区域。这样会导致当程序需要创建大对象进行程序执行时,找不到足够的空间,从而又一次触发垃圾回收动作。

(2)复制算法

将内存按容量分为两部分,每次只用其中一块,当这一块用完了,就将还存活的对象复制到另一块上,然后再把使用过的内存空间清理掉,无内存碎片问题。只是将内存缩减一半,代价有点高~

(3)标记-整理算法

首先是标记,然后将所有存活的对象向一端移动,最后直接清理掉端边界以外的所有内存。

(4)分析收集算法

内存划分块,个新生代和老块中的对象回收仍需要标记-清除算法。


2 0
原创粉丝点击