jvm-之对象生死

判断java对象存活方法

1.引用计数算法

给对象中添加一个引用计数器,每当有一个地方引用它时,计数器就加一,当引用失效时,计数器就减一。任何时刻计数器为0的对象就是不能再被使用。
引用计数法实现简单,效率高。但是存在一个循环引用问题。
例:objA.inc = objB; objB.inc = objA; objA = null; objB = null;

2.可达性分析算法

通过一系列称为”GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所有走过的路径称为引用链。当一个对象到”GC Roots”没有任何引用链相连,即从GC Roots到这个对象不可达。则证明这个对象是不可用的。

GC Roots包括:

  • 虚拟机栈中引用的对象
  • 方法区中的类静态属性引用的对象
  • 方法区中常量引用的对象
  • 本地方法栈中JNI引用的对象

再谈引用:

  • 强引用:类似 Object obj = new Object(); obj 就是强引用。
  • 软引用:描述一些有用但并非必须的对象。在系统将要发生内存溢出异常时,会把这些对象列入回收范围。如果还没有足够的内存才会抛出内存溢出异常。SoftReference
  • 弱引用:描述非必须的对象,但强度更弱。弱引用对象只能生存到下一次垃圾回收之前。无论当前内存是否足够,都会被回收掉。WeakReference
  • 虚引用:最弱的一种引用关系。唯一的目的是能在这个对象被收集器回收时收到一个系统通知。PhantomReference

生存还是死亡:

真正宣告一个对象死亡,至少压经历两次标记过程。第一次标记那些到GC Roots不可达的对象,把它们放入一个叫F-Queue的队列之中。第二次由一个jvm自动建立Finalizer线程去处理队列,对队列中的对象进行再一次标记。