如何确定JVM堆中哪些对象是可以被回收的
2018-01-30 22:05
387 查看
垃圾回收器在对堆进行回收之前,需要确定堆中哪些对象是可以继续存活的,哪些是可以被回收的,Java采用可达性分析算法来判定对象是否可以继续存活。
这个算法的过程是通过一系列的称为“GC Roots”的对象作为起点,从这些起始点开始向下搜索,搜索过程中所有走过的路径称为引用链,当一个对象和引用链没任何连接的时候,则表明这个对象是可以被回收的。
可作为“GC Roots”对象的有如下几种:
Java虚拟机栈(栈帧中的本地变量表)中引用的对象;
本地方法栈中JNI(即一般说的Native方法)引用的对象;
方法区中类静态属性引用的对象;
方法区中常量引用的对象。
还有一个用于标识哪些对象可以被回收的算法,不过这个算法并没有被Java语言采用,即引用计数法。这个算法的过程是:给每个对象添加一个引用计数器,每当这个对象被引用一次,计数器加一;每当这个对象引用失效的时候,计数器减一;引用计数器为零的对象表示是可以被回收的对象。虽然这个算法很简单,但是它无法解决对象之间互相循环引用的问题,所以Java没有采用。
这个算法的过程是通过一系列的称为“GC Roots”的对象作为起点,从这些起始点开始向下搜索,搜索过程中所有走过的路径称为引用链,当一个对象和引用链没任何连接的时候,则表明这个对象是可以被回收的。
可作为“GC Roots”对象的有如下几种:
Java虚拟机栈(栈帧中的本地变量表)中引用的对象;
本地方法栈中JNI(即一般说的Native方法)引用的对象;
方法区中类静态属性引用的对象;
方法区中常量引用的对象。
还有一个用于标识哪些对象可以被回收的算法,不过这个算法并没有被Java语言采用,即引用计数法。这个算法的过程是:给每个对象添加一个引用计数器,每当这个对象被引用一次,计数器加一;每当这个对象引用失效的时候,计数器减一;引用计数器为零的对象表示是可以被回收的对象。虽然这个算法很简单,但是它无法解决对象之间互相循环引用的问题,所以Java没有采用。
相关文章推荐
- JVM如何判断哪些对象可以被回收
- 已知一指针p,你可以确定该指针是否指向一个有效的对象吗?如果可以,如何确定?如果不可以,请说明原因。
- 学习之如何确定用到哪些IO类对象
- jvm如何判断对象是否可以被回收
- JVM如何判断一个Java对象是否可以回收
- 已知一指针p,你可以确定该指针是否指向一个有效的对象吗?如果可以,如何确定?如果不可以,请说明原因。
- 深入理解java虚拟机读书笔记--->如何判断对象可以被回收?
- 如何判定对象已死可以回收内存
- Java虚拟机如何判断对象已死?(哪些内存需要回收)
- JVM如何判断一个Java对象是否可以回收
- Java虚拟机:如何判定哪些对象可回收?
- Java虚拟机:如何判定哪些对象可回收?
- 如何在运行时确定对象类型(RTTI)
- Silverlight中的TabControl如何绑定数据?重写tabcontrol和tabItem 解决绑定友好问题。可以绑定对象集合
- 如何利用c++编写不能被继承、但可以在类外定义对象的类
- 如何在运行时确定对象类型(RTTI)
- 雪球:普通人如何合理的理财投资,有哪些书可以学习阅读?
- 如何在运行时确定对象类型(RTTI)
- 如何在运行时确定对象类型(RTTI)
- JVM如何判断对象是否需要被回收