`
不爱不见
  • 浏览: 274491 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

jvm如何判断对象已死?

    博客分类:
  • JVM
阅读更多
在java的垃圾回收中,jvm是如何判断堆中的对象是否已死呢?主流的判断方法有两种。
1.引用计数算法:
  这种算法的思路是如果某一个对象被别的对象引用,那么就把他们引用计数器加上1,这样当进行垃圾回收时如何判断该引用的数量为0,此时就代表没有进行任何对象对其进行引用,这种方法判断效率很高,在很多情况下是个不错的选择,例如微软的COM,AS3的FlashPlayer,Python语言等都是采用引用计数器进行判断的,java没有采用此 用法的原因是他无法解决循环引用的问题。
eg :
public class RefernceCountGC{
   public static instance = null;
   public static final int _1MB = 1024 * 1024 ;
 
   private byte[] bigSize = new byte[2 * _1MB];
   public static void testGC(){
      RefernceCountGC  objA = new RefernceCountGC();
      RefernceCountGC  objB = new RefernceCountGC();
    
     objA.instance= objB ;
     objB.instance = objA ;
     objA = null;
     objB = null ;
     System.gc();
  }
}
上面的两个对象objA和objB相互引用,如果用计算器算法的话会导致无法进行回收。

2.根搜索算法:
   主流的语言Java,C#甚至古老的语言Lisp都是采用根搜索算法进行垃圾回收的,这个算法的思路就是通过命名一系列的“GC Root"作为起点,从这些起点开始向下搜索,这样可以形成一条引用链,该引用链之外的对象都将被回收,在java钟只有一下的对象才可以被作为GC Root.
1>虚拟机栈(栈帧中的本地方法表)中引用的对象。
2>方法区中类静态属性引用的对象。
3>方法区中常量引用的对象。
4>本地方法栈JNI(即一般说的Native方法)的引用对象。
3.关于引用:
  在jdk1.2之前,java中的引用时这样定义的:如果reference类型的数据中存储的是另一块内存的起始地址,就称这块内存代表着一个引用。这样定义过于狭隘,因为这是一个对象只有引用和被引用两种状态,描述一下"食之无味,弃之可惜"的对象则无能无力,我们希望描述这样的一类对象,当内存空间还够是,则能留在内存中,否则内存进行垃圾回收后还紧张,那么可以抛弃这些对象,jdk1.2后对引用进行了扩充,分为:强引用(Strong Reference),软引用(Soft Reference),弱引用(Weak Reference),虚引用(Phantom Reference)四种。
  3.1 强引用。
   该引用是代码中普通存在的,例如Object objA = new Object(),只要强引用存在,垃圾收集器永远不会回收掉被引用的对象。
  3.2 软引用。
  该引用用来描述一些还有用,但是并非必须得对象,在系统将要爆发内存溢出之前,将会把这些对象列在进行回收的范围之内,进行二次回收后如果还是内存不足,这时候才跑出内存溢出的错误。
  3.3 若引用。
   该引用也是用来描述非必须对象的,强度比软引用更弱被若引用引用的对象只能存活到下一次垃圾回收之前。
  3.4 虚引用也称为幻影引用。
  是最弱的一种的引用,一个对象是否存活与其生存周期没有什么影响,设置该引用的目的仅仅 是希望这个对象被释放的时候能够收到一个系统通知。

4.生存还是死亡?
  如果进行垃圾回收的时候发现一个对象没有在GC Root链上,那么就需要进行两次的标记过程,如果当前发现没有关联在GC Root链上,那么就会进行第一次标记,如果此时对象的finalize()方法没有被覆盖或该方法已经被虚拟机调用过,那么此时将被标记为没有必要执行,此时该对象会被放入”即将回收“集合,否则就会放入F-Queue的对象中等待执行finalize()方法,如果在此方法中对象将自己与GC Root链上的任何一个对象关联,那么就会被溢出”即将回收“集合。
2
5
分享到:
评论
2 楼 code_cj 2012-09-24  
好像在哪里看过,有点熟眼...
1 楼 ansjsun 2012-09-24  
不错不错..就是有点粗略..希望能介绍下.标记整理和标记删除..

相关推荐

    JVM的GC如何判断对象是否死亡?

    这节我们主要讲垃圾收集的一些基本概念,先了解垃圾收集是什么、然后触发条件是什么、最后虚拟机如何判断对象是否死亡。 一、前言   我们都知道Java和C++有一个非常大的区别就是Java有自动的垃圾回收机制,经过半...

    jvm如何判断对象己死详解

    jvm如何判断对象己死详解

    JVM 面试题总结.md

    - 如何判断对象已经死亡? - 如何判断一个不再使用的类? - JVM 分代收集理论有哪些? - 聊一聊 JVM 中的垃圾回收算法? - 标记-清除算法 - 标记-复制算法 - 标记-整理算法 - 什么是记忆集,什么是卡表?...

    JVM中对象的生命周期

    关于JVM中对象的生命周期的讲解,不错!!

    《剑指offer》JVM面试题总结.pdf

    如何判断对象已经死亡? 如何判断一个不再使用的类? JVM 分代收集理论有哪些? 聊一聊 JVM 中的垃圾回收算法? 标记-清除算法 标记-复制算法 标记-整理算法 什么是记忆集,什么是卡表?记忆集和卡表有什么关系? ...

    面向对象和JVM内存模型.pdf

    Java对象跟JVM讲解,Java对象跟JVM讲解,Java对象跟JVM讲解,Java对象跟JVM讲解,Java对象跟JVM讲解,Java对象跟JVM讲解,

    Java JVM 面试题总结

    JVM 面试题总结 JVM 的主要作用是什么?...在 JVM 中,对象是如何创建的? 内存分配方式有哪些呢? 请你说一下对象的内存布局? 对象访问定位的方式有哪些? 如何判断对象已经死亡? 如何判断一个不再使用的类?

    对象在jvm中的存储情况

    java对象在jvm中的存储情况 jvm

    测定JVM中对象占用内存—SizeOf

    原项目下载地址:...使用说明: 1、将SizeOf.jar放到Eclipse工程路径下,添加到classpath中; 2、运行前添加VM参数:-javaagent:lib/SizeOf.jar 运行即可(将jar放在lib路径下)。

    JVM Dump与Java对象的内存布局

    介绍了heap dump和thread dump,以及详细介绍dump工具Memory Analyzer的使用,最后讲解了Java对象的内存布局。

    Jvm对象内存分配理解

    Jvm对象内存分配理解

    JVM之对象在堆中的流转 - 副本.md

    JVM之对象在堆中的流转 - 副本

    JVM与GC调优课程视频

    ├── 第4篇-对象内存布局.png?x-oss-process=style/pnp8 ├── 第5篇:执行引擎篇.png?x-oss-process=style/pnp8 ├── 第6篇-垃圾回收篇.png?x-oss-process=style/pnp8 ├── 第7篇-JVM性能监控篇.png?x-oss-...

    jacob.jar JVM访问COM对象

    JACOB是一个 JAVA到微软的COM接口的桥梁。使用JACOB允许任何JVM访问COM对象,从而使JAVA应用程序能够调用COM对象。如果你要对 MS Word、Excel 进行处理,JACOB 是一个好的选择。JACOB目前已经成为sourceforge(ht

    java性能调优-jvm创建对象和-performance-createobj-allocationmemory.zip

    java性能调优-jvm创建对象和-performance-createobj-allocationmemory

    JVM入门实战/arthas实战/垃圾回收算法/垃圾回收器/jvm内存模型分析

    本系列课程从JVM基础到高级实战,老师手把手教你如何进行JVM调优,思路清晰,没有废话,旨在挑战高薪。 课程亮点: 1、基于阿里arthas进行JVM调优; 2、基于代码排查OOM问题,拒绝空讲; 3、总结JVM通用的调优思路;...

    JVM实战-对象访问与内存溢出异常解析

    JVM实战-对象访问与内存溢出异常解析

    JVM垃圾回收机制

    Jvm垃圾回收机制 by linux_14胡嘉辉1.如何确定某个对象是“垃圾”? 2.典型的垃圾收集算法3.典型的垃圾收集器

Global site tag (gtag.js) - Google Analytics