如何判断对象是否已经死亡

判断对象是否已经死亡的方法有两种

1.引用计数算法

介绍:给对象添加一个引用计数器,没当有一个地方引用它的时候,计数器加1,当引用失效时,计数器就减一,当计数器为0的对象就是不可能被使用的。
优缺点:判断对象是否存活的效率高,但是无法解决对象之间的循环引用问题。

2.根搜索算法
介绍:通过一系列名为GC Roots的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链,说明不可达,则可以回收。
也就是说如果GC ROOt对象没有引用这些对象,则这些对象可以回收
优缺点:可以解决循环引用问题,缺点是判定对象是否已死的速度较慢

GC Roots
1.虚拟栈,即栈帧中的本地变量表( 局部变量表)中的引用对象。(我觉得是方法内部对象)
2.方法区的类静态变量引用的对象
3.方法区中的常量引用的对象
4.本地方法中引用的对象

一般我们引用中存着堆中对象的地址或者句柄地址

生存还是死亡
1.当被jvm 第一次标记不可达的时候会被标记依次,并看起示范需要执行finalize()方法,当对象没有覆盖这个方法或者这个方法已经被调用了,虚拟机都视为不需要执行。不需要执行则第二次标记的时候直接回收
2.如果需要执行,jvm会把该对象放入F-Queue队列,并启动一个优先级很对的finalizer线程去执行这个方法,但是是否执行还看具体情况,jvm不承诺一定执行。
3.如果我们在finalize()方法重新把对象和gcroot挂钩则对象,不会被回收

回收方法区
1.回收废弃常量,只要没有GC ROOt 引用
2.回收无用的类条件:该类所有的实例都被回收,加载该class的classloader 已经被回收,该类的class对象没有在任何地方引用,即无法在任何地方通过反射获取该类的方法

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 原文阅读 前言 这段时间懈怠了,罪过! 最近看到有同事也开始用上了微信公众号写博客了,挺好的~给他们点赞,这博客我...
    码农戏码阅读 11,238评论 2 31
  • 1.什么是垃圾回收? 垃圾回收(Garbage Collection)是Java虚拟机(JVM)垃圾回收器提供...
    简欲明心阅读 90,265评论 17 311
  • 这篇文章是我之前翻阅了不少的书籍以及从网络上收集的一些资料的整理,因此不免有一些不准确的地方,同时不同JDK版本的...
    高广超阅读 15,974评论 3 83
  • 四十二重楼LR阅读 1,481评论 0 4
  • 人与人的差距在哪里呢?除了外在皮囊,更多的就是内在。那内外又分为哪些,内在的差距是什么呢?其实我认为人与人之间的差...
    youcare33阅读 3,610评论 0 0

友情链接更多精彩内容