java-JVM中对象判活

来源:互联网 发布:网络视频自己组装枪支 编辑:程序博客网 时间:2024/06/01 10:42

我们对java有了解的都知道,当一个对象没有引用指向它时,虚拟机会在GC的时候会回收掉分配的内存,其实这样说是不准确的,下面我就详细的说一下,虚拟机是怎么样判断一个对象还是活着的,即对象判活问题,当我们遇到这样一个问题,这样判断一个对象上的引用的,我相信大家很快都会想到引用计数法,那么什么是引用计数法呢?
引用计数法
通过一个数值来记录对象上被引用的数量,当数值为0时,我们认为这个对象的内存空间是可以回收的,这种方法会遇到一种很难解决的情况,就是循环引用,即A对象有B的引用,而B有A的引用,其实A已经没有用了,因为B有对他的引用,所以不能回收,而B也是这样的情况,这样就无法回收AB 的内存。这是这种方法的弊端,而实际上JVM不是使用的这种方法。
可达性判别法
JVM设计者根据类加载的特点,提出了可达性判别法,那么什么是可达的,而什么是不可达的,也提出了标准。认为对象之间引用是一个树形结构,规定出几种可以做root的对象,从这些对象遍历,如果不存在路径到达这个对象,我们认为这个对象是不可达的,也就是内存可以回收。但也不是一定会立即回收掉,只是把它放在回收队列里,等待GC,这时候如果有一个引用指向它,那么还是可以回到可达性队列的。
在java语言中,可作为GC roots的对象包括下面几种:
1.虚拟机栈中引用的对象
2.方法区中类静态属性引用的对象
3.方法区常量引用的对象
4.本地方法栈中JNI引用的对象

0 0
原创粉丝点击