关闭

java的垃圾回收

标签: java虚拟机
129人阅读 评论(0) 收藏 举报
永久代的垃圾收集主要收集两部分内容:废弃常量和无用的类(收集方式和对象的收集方法类似)。判断一个类是否无用的标准:
1)该类所有的实例都已经被回收,也就是java堆中不存在该类的任何实例。
2)加载该类的ClassLoader已经被回收。

3)该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法

标记-清除算法:
分为标记和清除两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。不足之处:一个是效率问题,标记和清除两个过程的效率都不是太高,另一个是空间问题,标记清除后会产生大量不连续的内存碎片,空间碎片太多可能导致以后在程序运行过程中需要分配较大的对象时,无法找到足够的连续内存而不得不触发另一次垃圾收集动作。


复制算法,将内存按容量划分为大小相等的两块,每次只使用其中的一块,当这一块内存使用完了,就将还存活着的对象复制到另一块上面,然后再把已使用过的内存空间一次清理掉,这样使得每次都要对整个半区进行内存回收,内存分配时也就不需要考虑内存碎片等复杂情况,只要移动堆顶指针,按顺序分配内存即可


标记-整理的标记过程和标记清理的标记过程一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活对象都向一段移动,然后直接清理掉标记以外的内存


即使在可达性分析算法中不可达的对象,也并非是非死不可的,这时候它们暂时处于缓刑状态。要真正死亡,至少需要经历两次标记过程:如果对象在可达性分析后发现没有GC Roots相连接的引用链,那么它将会被第一次标记并且进行一次筛选,筛选的条件是此对象是否有必要执行finalize方法,当对象没有覆盖finalize,或者finalize方法已经被虚拟机调用,虚拟机将这两种情况视为没有必要执行。finalize方法是对象逃脱死亡的最后一次机会,稍后虚拟机将会对F-Queue(没有必要执行finalize方法的对象队列)进行第二次标记,这个时候一个对象如果没有被重新引用,那么就要被收集了

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:77857次
    • 积分:2089
    • 等级:
    • 排名:第18989名
    • 原创:103篇
    • 转载:196篇
    • 译文:2篇
    • 评论:6条
    最新评论