jvm哪些对象不会回收,jvm如何确定一个对象可以被垃圾回收器回收

  jvm哪些对象不会回收,jvm如何确定一个对象可以被垃圾回收器回收

  00 -1010每个对象都有引用计数。每次引用一个对象,引用计数器为1,对象的引用被释放,引用计数器为-1。直到对象的引用计数为0,对象标识才能被回收。

  这可以用数据算法中的图形来表示。对象A-对象B-对象C都有引用,所以不回收。因为没有引用对象B,所以没有到达对象B的路径,对象B的引用计数为0,所以对象B会被回收。

  但是,这种算法有明显的缺陷。在循环引用的情况下,循环引用对象不会被回收。比如下图:对象A和对象B被循环引用。如果没有其他对象引用A和B,A和B都不会被回收。

  00-1010这个算法目前定义了几个根,即这些对象是jvm虚拟机不会回收的对象,所以这些对象引用的对象都在使用中,这些对象未使用的对象是即将回收的对象。也就是说,如果一个对象可以到达root,它就不会被回收;如果它不能到达根,它将被回收。

  由引导类(boot loader)加载的类和由jvm运行时方法区域创建的对象类静态变量(static)jvm运行时方法引用的对象转到JVM当前运行线程对象中虚拟机堆栈变量表引用的常量池对象jni本地方法堆栈引用的对象

  jvm使用根搜索算法来确定是否回收该对象。

  补充:jvm判断对象的回收

  00-1010可达性分析算法:通过一系列“GC根”根对象作为起始节点集,根据引用关系向下搜索。如果一个对象和根对象之间没有引用链,那么这个对象是不可达的。

  但是,可达性分析后不可达的对象不一定要回收,而是要经过二次标记过程。

  00-1010 1.如果可达性分析后对象不可达,将第一次对其进行标记。然后进行过滤,过滤条件是是否执行finalize()方法。

  如果对象没有重写finalize()方法,或者finalize()已经被调用过一次,则不需要执行finalize()方法。则确定该对象需要回收。(对象的finalize()方法只会被系统调用一次,下次回收对象时不会执行finalize()

  如果对象覆盖了finalize()方法,并且finalize()方法尚未被调用,则需要执行finalize()方法。2.如果对象需要执行finalize()方法,那么对象会被放在F-Queue的一个队列中,然后一个finalizer线程会执行这些对象的finalize()方法。

  3.然后,收集器会将对象堆叠在F队列队列中,以便进行二次标记。如果对象在finalize()方法中转义失败,那么对象会被标记两次,被标记的对象会被判断为需要回收;

  (在finalize()方法中,一个对象可以在自己和引用链中的对象之间建立引用关系,这样当它第二次被标记时,收集器就会把它移出回收对象的集合,从而进行转义。)

  关于如何判断jvm中的对象被回收的这篇文章到此为止。关于jvm判断对象回收的更多信息,请搜索热门IT之前的文章或者继续浏览下面的相关文章。我希望你以后能更多地支持流行音乐!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: