JVM——对象已死吗?(Java对象引用分析)

原创 2018年04月14日 23:55:08

对象已死?

谈到JVM,就不得不提到他的自动内存管理,那么就离不开垃圾回收,那么,作为Java中,占据首要位置的对象,JVM如何确定它已经死亡? 或者说,何时GC将其回收?

现在主流的两个方式是:1.引用计数法 2.可达性分析算法

引用计数法

顾名思义,就是在对象每被引用一次,就将其自身用于计数的变量加一,当GC进行时,通过判断该变量是否等于0,从而决定是否回收。目前使用该方式的有Python等。
优点:简单明了,实现容易。
缺点:对于这种情况: 对象A中存在B的引用,对象B中存在A的引用,当两个对象除了对方之外,没有其他引用,且已经无用之后,计数却仍然不为零,这就造成了内存泄露。

可达性分析算法

通过确定GCroots,然后Gcroot向下寻找引用关系,能够找到引用关系的对象就不会被回收,否则回收。GC Roots一般选择有四种:
1.方法区的常量对于对象的引用。
2.方法区中类静态属性对于对象的引用.
3.虚拟机栈中本地变量中对于对象的引用。
4.本地方法区中对于对象的引用。

再谈引用

引用分为四种:

  • 强引用
  • 软引用
  • 弱引用
  • 虚引用

其中,强引用为 new出来的,只要引用关系还在,就永远不会被回收。
软引用次于强引用,当虚拟机将要发生OutOfMemory时,会触发GC回收这部分,如果回收后依旧不足,才会发生OutOfMemory异常。
弱引用更次于软引用,只要发生GC,将直接回收这部分,不管它是否在使用。
虚引用是最弱的引用,他的存在不会对对象有任何影响,唯一作用就是在对象被GC时,发出一个系统通知。

生存还是死亡?

当可达性分析过后,是否所有的不可达对象就一定会被回收?答案是否定的。
对于不可达对象,虚拟机还是要给他们一些机会的。此时,虚拟机会对这些对象进行二次标记,具体做法是:

第一次标记时,判断对象是否 覆盖了 finalized()方法,如果没有,它就死定了。如果覆盖了,虚拟机会判断是否有必要执行它的finalized方法,判断条件是这个方法是否被执行过。执行过就不再执行(只会执行一次)。

然后在第二次标记之前,如果对象的finalized方法中,重新将自己与可达对象引用上了 如 xxx=this。那么它就逃出生天。否则,GG。

回收方法区

方法区主要回收:废弃的常量、无用的类
废弃的常量很好理解,但是对于无用的类,怎么判断它无用呢?

虚拟机有一下条件:
1.该类的不存在任何实例
2.该类的类加载器被回收
3.该类对应的Java.lang.Class实例没有在任何地方被引用,即不能通过反射访问该类的方法。


多复习多看书。。。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zwzsdy/article/details/79945835

java 如何判断对象已死

已死的对象就是不可能被任何途径使用的对象,有以下几种方法判断一个对象是否已经死了: 引用计数 给对象添加一个引用计数器,每当有一个地方引用他,计算器就加1;当引用失效时,计数器减1;任何时...
  • fjkxyl
  • fjkxyl
  • 2017-04-11 14:50:37
  • 448

JVM对象已死吗

1.引用计数器(Reference Counting)   给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1,当引用失效时,计数器值就减1,任何时刻计数器为0的对象就是不可能再被使用...
  • tanga842428
  • tanga842428
  • 2016-08-23 10:11:00
  • 310

JVM如何判断对象"死"和"活"

堆中存放着几乎所有的
  • yyywyr
  • yyywyr
  • 2014-09-15 23:55:40
  • 2135

深入理解JVM03--判断对象是否存活(引用计数算法、可达性分析算法,最终判定),Eclipse设置GC日志输出,引用

堆中几乎存放着Java世界中所有的对象实例,垃圾收集器在对堆回收之前,第一件事情就是要确定这些对象哪些还“存活”着,哪些对象已经“死去”(即不可能再被任何途径使用的对象) 1、引用计数算法(Refer...
  • oChangWen
  • oChangWen
  • 2016-05-14 17:56:06
  • 7525

深入JVM对象引用

在jdk 1.2以前,创建的对象只有处在可触及(reachaable)状态下,才能被程序所以使用,垃圾回收器一旦发现无用对象,便会对其进行回收。但是,在某些情况下,我们希望有些对象不需要立刻回收或者说...
  • dd864140130
  • dd864140130
  • 2015-11-17 12:19:31
  • 3191

Java中对象、对象引用、堆、栈、值传递以及引用传递的详细解释

Java中对象、对象引用、堆、栈、值传递以及引用传递的详细解释 1.对象和对象引用的区别: (1).对象: 万物皆对象。对象是类的实例。在Java中...
  • u014225510
  • u014225510
  • 2015-06-27 10:19:52
  • 2642

JVM对象引用与内存分配策略

前两天对《深入理解虚拟机》一书做了个总结:《JVM理解其实并不难! 》,今天针对垃圾回收和内存分配做个深入了解。 关于引用 在《JVM理解其实并不难! 》一文中提到,JVM是通过可达性分析来判断对...
  • huachao1001
  • huachao1001
  • 2016-05-31 20:46:41
  • 2733

java中基本变量、对象、对象引用等在堆与栈中存储、按值传递机制、栈中对象共享机制

一般面试题中都会考Java传参的问题,并且它的标准答案是Java只有一种参数传递方式:那就是按值传递,即Java中传递任何东西都是传值。如果传入方法的是基本类型的东西,你就得到此基本类型的一份拷贝。如...
  • yuliangliang092
  • yuliangliang092
  • 2016-05-13 21:59:05
  • 1535

jvm中实例(引用),对象存储位置

一个完整的Java程序运行过程会涉及以下内存区域: 1、寄存器: JVM内部虚拟寄存器,存取速度非常快,程序不可控制。 2、栈: 保存局部变量的值,包括:1.用来保存基本数据类型的值;2.保存...
  • qq_33702584
  • qq_33702584
  • 2017-10-31 10:04:47
  • 322
收藏助手
不良信息举报
您举报文章:JVM——对象已死吗?(Java对象引用分析)
举报原因:
原因补充:

(最多只允许输入30个字)