您的位置:首页 > 其它

垃圾收集器与内存分配策略--判断对象是否可被回收

2019-02-19 18:23 281 查看

1.引用计数法
给每个对象添加一个以引用计数器,缺点:难以解决循环引用问题
2.可达性分析算法
通过一系列GC Roots 对象作为起点,从这个节点往下搜索,如果一个对象是GC Roots不可达的,则被认为是可回收的。
GC Roots主要包括1)虚拟机栈的局部变量表中引用的对象,2)静态字段引用的对象,3)常量池中引用的对象,4)本地方法栈中引用的对象
3.不同的引用强度
4.生存还是死亡

被列入回收名单的对象是否就一定被回收,答案是不确定的。
因为一个对象进行可达性分析之后发现没有与GC Roots相链接 的引用链,如果发现对象的finalize被重写了,并且未被执行过,则该对象还有挣扎的空间。Finalizer线程来执行这些回收名单中有挣扎空间的对象,如果在finalize方法中对象把自己(this)赋值给某个类变量或者对象的成员变量,那么对象挣扎成功不会被回收。但是finalize不确定性很大,不建议使用,try-catch相对来说释放资源更稳定有效。
5.回收方法区
主要回收废弃常亮和无用的类
判断类无用的三个条件:1)该类的所有实例已被回收,2)加载该类的ClassLoader已经被回收,3)该类对应的java。lang。class对象没有在任何地方引用,无法通过反射访问该类
垃圾收集算法
1.标记-清除算法
2.复制算法,用于“朝生夕死”的新生代。HotSpot默认将内存分为一块较大的Eden和两块较小的Survivor
3.标记-整理算法,与“标记-清除”算法原理类似,区别在于,标记-整理之后的内存是连续的,适用于老年代

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐