判断java虚拟机内存里的对象已死两种方式
来源:互联网 发布:彩票中奖的人 知乎 编辑:程序博客网 时间:2024/06/07 15:24
第一种:引用计数饭:给对象添加一个引用计数器,每当有一个地方需要引用它的时候 ,计数器的值就加1,否则就减1,计数器的值为0的时候,就说明对象已死
缺点:如果该对象被外一个引用指着,前一个引用永远不会再被利用了,但是她的计数器不为零,则那个对象永远不会被认为死掉,
实际上,虚拟机还是会回收他们的,所以,虚拟机不是用这种方式回收他们的,
第二种:根搜索算法:通过一系列的名为“gc roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过 的路径称之为引用连(reference chain),当一个对象到gc roots
没有任何引用链相连(用图论的话来说就是从Gc Roots到这个对象不可达)时,证明这个对象是不可用的,辉判断为可回收对象,但不会立即回收,它还有一次机会
如果对象在进行跟搜索后发现没有与GC roots,相连接的引用链,那他将会被第一次标记并且进行一次筛选,判断有没有必要进行回收:筛选的条件是此对象有没有必要执行finalize():如果对象没有覆盖finalize()方法,或者已经被虚拟机调用过,则java虚拟机将这两种情况视为没必要执行;如果被判定执行finalize()方法,就会被放到一个
F-Queue队列之中,并在稍后有虚拟机自动建立一个低优先级的Finalizer线程去执行,这里所谓的“执行”是指虚拟机会触发这个方法,但并不承诺会等待它运行结束。这样做的原因是,如果一个对象在finalize()方法中执行缓慢,或则发生了死循环,将很可能导致F-queue队列中的其它对象永久处于等待状态,甚至导致整个内存回收系统崩溃。finalize()方法是对象逃脱死亡命运的最后一次机会,稍后gc将对F-queue中对象进行二次标记,他们就会死掉,即被回收
finalize()的方法,它的工作原理应该是这样的:一旦垃圾收集器准备好释放对象占用的存储空间,它首先调用finalize(),而且只有在下一次垃圾收集过程中,才会真正回收对象的内存。所以如果使用finalize(),就可以在垃圾收集期间进行一些重要的清除或清扫工作(如关闭流等操作)。但JVM(Java虚拟机)不保证此方法总被调用。
- 判断java虚拟机内存里的对象已死两种方式
- JAVA虚拟机:GC对象的判断方法
- 《深入理解java虚拟机》读书笔记:Java对象的内存布局
- 深入理解java虚拟机——判断对象的“死活”
- 深入理解java虚拟机(二)HotSpot Java对象创建,内存布局以及访问方式
- Java虚拟机如何判断对象已死?(哪些内存需要回收)
- Java虚拟机中对象的内存布局及访问定位
- 深入理解Java虚拟机之对象的内存布局
- Java 虚拟机学习 - 对象访问的定位方式
- java虚拟机——对象的布局、访问方式
- 虚拟机里查询ip的方式
- 深入Java虚拟机--判断对象存活状态
- Java虚拟机 - 对象内存分配与回收
- Java内存区域与HotSpot虚拟机对象
- Java虚拟机专题对象内存定位
- Java虚拟机对象创建及其内存分配
- shell里的条件判断方式
- java 虚拟机的内存限制
- 混淆矩阵
- django1.9.1+apache24+mod_wsgi详解(win)
- java学习前言
- 昌大软院大神养成计划之网页设计之路第四天
- 海量数据处理问题
- 判断java虚拟机内存里的对象已死两种方式
- 费马小定理
- ICL Auto Vectorization
- java静态内部类
- 喂11月你怎么没有太阳
- Android——真机无线调试
- Radius协议分析
- Python标准库urllib2的使用细节
- 将Sublime Text 添加到鼠标右键的方法