垃圾回收机制怎么判断对象是否有用 从什么地方清理出去
2018-04-22 21:56
495 查看
引用计数器与标记清除算法
java垃圾回收算法之-引用计数器,这个算法其中一个优点便是,实时性,只要对象的引用计数器的值为0,则立刻回收。接下来介绍的标记清除算法,当对象的引用计数器的值为0时,不会立刻被回收的。
root对象
在标记清除算法中,会把如下对象称之为root对象
1.被栈中的变量(栈中存的是对象的引用)所引用的对象
2.被static变量引用的对象
可访问的对象
如果栈中有一个变量a引用了一个对象,那么该对象是可访问的,如果该对象中的某一个字段引用了另一个对象b,那么b也是可访问的。可访问的对象也称之为live对象
标记清除算法介绍
该算法有两个阶段。
1. 标记阶段:找到所有可访问的对象,做个标记
2. 清除阶段:遍历堆,把未被标记的对象回收
备注:
该算法一般应用于老年代,因为老年代的对象生命周期比较长。
标记阶段算法
伪代码类似如下:
for each root variable r
mark (r);
sweep ();
为了能够区分对象是live的,可以为每个对象添加一个marked字段,该字段在对象创建的时候,默认值是false
假设有一个对象p,p对象还间接的引用了其他对象,那么可以使用一个递归算法去进行标记,例如:
void mark(Object p)
if (!p.marked)
p.marked = true;
for each Object q referenced by p
mark (q);
这个mark方法只有当所有对象已经被mark后才会退出。
清除阶段算法
在这个阶段,需要去遍历堆中所有对象,并找出未被mark的对象,进行回收。与此同时,那些被mark过的对象的marked字段的值会被重新设置为false,以便下次的垃圾回收。
伪代码如下:
void sweep ()
for each Object p in the heap
if (p.marked)
p.marked = false
else
heap.release (p); 阅读更多
java垃圾回收算法之-引用计数器,这个算法其中一个优点便是,实时性,只要对象的引用计数器的值为0,则立刻回收。接下来介绍的标记清除算法,当对象的引用计数器的值为0时,不会立刻被回收的。
root对象
在标记清除算法中,会把如下对象称之为root对象
1.被栈中的变量(栈中存的是对象的引用)所引用的对象
2.被static变量引用的对象
可访问的对象
如果栈中有一个变量a引用了一个对象,那么该对象是可访问的,如果该对象中的某一个字段引用了另一个对象b,那么b也是可访问的。可访问的对象也称之为live对象
标记清除算法介绍
该算法有两个阶段。
1. 标记阶段:找到所有可访问的对象,做个标记
2. 清除阶段:遍历堆,把未被标记的对象回收
备注:
该算法一般应用于老年代,因为老年代的对象生命周期比较长。
标记阶段算法
伪代码类似如下:
for each root variable r
mark (r);
sweep ();
为了能够区分对象是live的,可以为每个对象添加一个marked字段,该字段在对象创建的时候,默认值是false
假设有一个对象p,p对象还间接的引用了其他对象,那么可以使用一个递归算法去进行标记,例如:
void mark(Object p)
if (!p.marked)
p.marked = true;
for each Object q referenced by p
mark (q);
这个mark方法只有当所有对象已经被mark后才会退出。
清除阶段算法
在这个阶段,需要去遍历堆中所有对象,并找出未被mark的对象,进行回收。与此同时,那些被mark过的对象的marked字段的值会被重新设置为false,以便下次的垃圾回收。
伪代码如下:
void sweep ()
for each Object p in the heap
if (p.marked)
p.marked = false
else
heap.release (p); 阅读更多
相关文章推荐
- jvm垃圾回收机制(二)算法和如何进行判断对象是否回收实例
- 垃圾回收机制中,引入计数是如何实现的,内部原理是什么,怎么维持对象引用的
- java 垃圾回收步步深入02----判断对象是否已死
- 怎样判断是否需要垃圾回收/对象是否存活
- jvm垃圾回收(GC)机制之如何判断对象已死
- 什么是GC对于GC垃圾回收机制的理解
- java gc垃圾回收机制主要回收堆内的对象
- 对象是否有被引用判断及垃圾收集算法
- iOS中是否支持垃圾回收机制
- 怎么判断两个对象是否完全相等
- 怎么判断对象是否与仪器连接?
- java实现面向对象和javaScript基于对象的区别&java垃圾回收机制和其他编程语言的比较
- 引用一个面试题:如果程序中没有任何变量引用一个外部类对象,但有变量引用其中的内部类对象,请问外部类对象是否会被垃圾回收器回收?请说明理由!
- .net GC垃圾回收机制回收的是什么?
- 轻松搞定java内存模型(三)判断对象是否应该被回收
- PHP5和PHP7的垃圾回收机制有什么不同
- JVM运行时数据区及判断对象是否该回收
- 对象的销毁与垃圾回收机制
- 《Thinking in Java 》学习笔记 --- Java内存分配,对象存放到什么地方?怎么放?
- python垃圾回收机制是什么