美文网首页Android开发经验谈Android开发程序员
Java虚拟机中对象是否可回收判别

Java虚拟机中对象是否可回收判别

作者: 进击de小黑 | 来源:发表于2017-08-27 15:48 被阅读62次

在堆里面存放着Java世界几乎所有的对象实例,垃圾收集器在对堆进行回收前,首先要确定对象的“存活”与“死去”,这就需要用到算法了。

1.引用计数算法(Reference Counting): 给对象中添加一个引用技术器,每当一个地方引用时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器为0的对象就是不可能再被使用的。

看上去很完美,引用计数算法实现简单,判定效率也很高。但是,主流的Java虚拟机并没有选用引用计数算法来管理内存,主要原因是它很难解决对象之间相互循环引用的问题,导致无法通知GC收集器回收。故Java并不是使用引用计数算法。

2.可达性分析算法(Reachability Analysis):通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连,即对象不可达时,则证明此对象不可用,即此对象可回收。(Java、C#的主流实现 )

可达性分析算法判定对象是否可回收.png

上图可以看到,Object5,Object6,Object7虽互有关联,但到GC Roots是不可达的,所以它们将会被判定为可回收的对象。
在Java语言中,可作为GC Roots的对象包括下面几种:

1 拟机栈中引用的对象
2 方法区中类静态属性引用的对象
3 方法区中常量引用的对象
4 本地方法栈中JNI运用的对象

当然,在进行了可达性分析后的不可达对象,也不是马上就回收的,还要进行至少两次的标记过程:如果对象没有与GC Roots相连接的引用链,那么就会第一次标记且进行一次筛选,筛选的条件时此对象是否有必要执行finalize()方法。当对象没有覆盖finalize()方法,或者finalize()方法已经被虚拟机调用过,这两种都被视为”没有必要执行“。如果这个对象没有必要执行finalize()方法,则这个对象会被放置到F-Queue的队列中,,并在稍后一个由虚拟机自动创建的、低优先级的Finalizer线程去执行,触发finalize()方法,如果在finalize()方法中拯救了自己—重新与引用链上的任何一个对象建立关联,那在第二次标识时它就会被移除出”即将回收“的集合;如果没有逃脱,那基本上就会真的被回收。

相关文章

  • Java虚拟机中对象是否可回收判别

    在堆里面存放着Java世界几乎所有的对象实例,垃圾收集器在对堆进行回收前,首先要确定对象的“存活”与“死去”,这就...

  • 深入学习JVM 【4】回收“已死”对象的过程

    上篇文章讲到,虚拟机判断一个对象是否可回收是根据“可达性分析”,不可达的对象就是可回收的对象,但是被判定为“不可达...

  • Java 对象占用内存大小

    Java 对象 如果想要了解java对象在内存中的大小,必须先要了解java对象的结构。 HotSpot虚拟机中,...

  • JVM--Garbage Collection

    垃圾回收(GC)一直是java语言的重中之重。 1 对象状态鉴别 1.1 标记对象是否可回收一般有两种算法: 引用...

  • 对Java对象的深入认识(三)

    1. Java对象 1.1 Java对象的组成 ​ 在HotSpot虚拟机中,对象在内存中存储的布局可以分为3...

  • JVM 中GC Roots对象有哪些?

    在java虚拟机的GC中,什么对象可作为GCRoot的对象?

  • Java内存模型

    本文主要介绍 1.Java虚拟机内存区域 2.判断对象是否存活算法 3.GC算法 一.Java虚拟机内存区域划分 ...

  • 关于Java多线程编程学习笔记之volatile

    Java内存模型   java中的堆内存是用来存储实例化的对象,它在虚拟机启动的时候创建,在Java虚拟机规范中规...

  • Java对象

    本文以HotSpot虚拟机为例,介绍Java对象在虚拟机中存储和使用方式。 对象的内存布局 对象在内存中存储布局可...

  • 32-实战3-JVM优化之JIT优化

    一、堆,是否是对象分配的唯一选择 在《深入理解Java虚拟机中》关于Java堆内存有如下描述:随着JIT编译期的发...

网友评论

    本文标题:Java虚拟机中对象是否可回收判别

    本文链接:https://www.haomeiwen.com/subject/zabbdxtx.html