堆中存放着几乎所有的对象实例,垃圾收集器在堆堆进行回收前,首先要确定这些对象哪些还“活着”,哪些已经“死去”。方法有如下两种:

(1)引用计数法

算法思想:为对象添加一个引用计数器,每当有一个地方引用该对象时,则该引用计数器值加1,;当引用失效时,则该引用计数器值减1;最后,计数器为0的对象就是不可能再被使用的,也即所谓的“死去”的对象。

Java中并没有使用这种算法进行GC,最主要的原因是很难解决对象之间的相互循环引用的问题。如下代码:

 public class TestReferenceCountingGC {

     public Object obj = null;

     public void testGc(){
TestReferenceCountingGC obj1 = new TestReferenceCountingGC();
TestReferenceCountingGC obj2 = new TestReferenceCountingGC();
obj1.obj = obj2;
obj2.obj = obj1;
obj1 = null;
obj2 = null; System.gc();
}
}

在上述代码中,obj1和obj2相互引用,除此之外,无其他任何引用,但因为相互引用对方导致引用计数器都不为0,因此无法通知GC收集器回收它们。

(2)根搜索算法

Java中是使用根搜索算法(GC Roots Tracing)判断对象是否存活的。

算法思想:选择名为“GC Roots”的对象为起始点,从这些GC Roots节点开始向下搜索,搜索走过的路径称之为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链时(即不可达,两者之间无通路),则认为该对象为不可用的。如下图:

如上图,Object3和Object4是相互连接的,但和GC Roots无通路,因此Object3和Object4被认为是可回收的对象。

 在Java中,可作为GC Roots的对象有如下:

    a、虚拟机栈(栈帧中的本地变量表)中的引用的对象

    b、方法区中的常量引用的对象

    c、方法区中的类静态属性引用的对象

    d、本地方法栈中JNI(Native方法)的引用的对象。

(3)引用的分类

a、强引用(Strong Reference)

程序代码中普遍存在的,比如Object obj = new Object(),只要存在强引用,GC收集器永远不会回收被引用的对象。

b、软引用(Soft Reference)

非必须的对象,是否回收,要看当前内存情况,如果紧张,则进行回收,否则不回收。当程序抛出内存溢出异常时,肯定不存在这种类型的对象。

c、弱引用(Weak Reference)

被弱引用关联的对象只能生存到下一次GC发生之前,即每次必被回收。

d、虚引用(Phantom Reference)

幽灵引用或者幻影引用,一个对象是否有虚引用的存在不会影响到其生存时间,无法通过虚引用获取对象实例。为一个对象设置虚引用关联的唯一      目的是希望能在这个对象被回收时受到一个系统通知。

(4)finalize

在根搜索算法中,那些不可达的对象,比如上图中的Object3和Object4,并非是“真正死亡”的,主要看如下两次标记过程:

a、当没有发现引用链时,进行第一次标记,此时进行第一次筛选,条件为此对象是否有必要执行finalize方法,当对象没有覆盖finalize方法,或者finalize方法已经被JVM调用过,此种情况下认为没有必要执行finalize方法

b、如果有必要执行finalize方法,此时对象会被放置在一个F-Queue队列中,会有一个优先级比较低的FInalizer线程去执行触发finalize方法。finalize方法是对象真正判定死活的最后一次机会。此时,GC会对队列中的对象进行第二次标记,如果对象在finalize方法中完成了自救,即和GC Roots建立了通路,则在第二次标记时该对象将被移出回收的集合。否则,只能判定对象死了。

 示例:对象自救:

执行结果是:finalize method executed

说明对象可以在GC时完成自救,需要注意的是这种自救只有一次,因为一个对象的finalize方法最多只会被系统自动调用一次。

JVM学习之对象的状态的更多相关文章

  1. jvm学习记录-对象的创建、对象的内存布局、对象的访问定位

    简述 今天继续写<深入理解java虚拟机>的对象创建的理解.这次和上次隔的时间有些长,是因为有些东西确实不好理解,就查阅各种资料,然后弄明白了才来做记录. (此文中所阐述的内容都是以Hot ...

  2. JVM学习03_new对象的内存图讲解,以及引出static方法(转)

    目录 -=-讲解对象创建过程中,-=-堆内存和栈内存的情况 -=-构造函数对类对象的成员变量的初始化过程 -=-构造函数出栈 -=-类的方法在不访问类对象的成员变量时造成的内存资源浪费怎么解决? -= ...

  3. JVM学习记录-对象已死吗

    前言 先来回顾一下,在jvm运行时数据区,分为两部分,一个部分是线程共享区,主要包括堆和方法区,另一部是线程私有区分包括本地方法栈,虚拟机栈和程序计数器.在线程私有部分的三个区域是随着线程生和灭的.栈 ...

  4. JVM学习-之对象的创建和内存分配

    最近看JVM内存模型,看了很多文章,大都讲到JVM将内存区域划分分:Mehtod-Area(No heap) 方法区,Heap(堆)区,Program Counter Register(程序计数器), ...

  5. Hibernate学习笔记(二)—— 实体规则&对象的状态&一级缓存

    一.持久化类 1.1 什么是持久化类? Hibernate是持久层的ORM映射框架,专注于数据的持久化工作.所谓的持久化,就是将内存中的数据永久存储到关系型数据库中.那么知道了什么是持久化,什么又是持 ...

  6. [原创]java WEB学习笔记79:Hibernate学习之路--- 四种对象的状态,session核心方法:save()方法,persist()方法,get() 和 load() 方法,update()方法,saveOrUpdate() 方法,merge() 方法,delete() 方法,evict(),hibernate 调用存储过程,hibernate 与 触发器协同工作

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  7. hibernate框架学习之对象状态

    lHibernate对象共有三种状态 •瞬时状态:瞬时对象 •持久化状态:持久化对象 •托管状态:托管对象 l瞬时对象(Transient Object),简称TO l瞬时对象指的是应用程序创建出来的 ...

  8. JVM学习(4)——全面总结Java的GC算法和回收机制

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及到的知识点总结如下: 一些JVM的跟踪参数的设置 Java堆的分配参数 -Xmx 和 –Xms 应该保持一个什么关系,可以让系统的 ...

  9. JVM学习(3)——总结Java内存模型

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及到的知识点总结如下: 为什么学习Java的内存模式 缓存一致性问题 什么是内存模型 JMM(Java Memory Model)简 ...

随机推荐

  1. C / C++算法学习笔记(8)-SHELL排序

    原始地址:C / C++算法学习笔记(8)-SHELL排序 基本思想 先取一个小于n的整数d1作为第一个增量(gap),把文件的全部记录分成d1个组.所有距离为dl的倍数的记录放在同一个组中.先在各组 ...

  2. 依赖注入及AOP简述(三)——依赖注入的原理

    3.     “依赖注入”登场 于是诸多优秀的IT工程师开始想出了更加轻量便利.更加具有可测试性和可维护性的设计模式——IoC模式.IoC,即Inversion of Control的缩写,中文里被称 ...

  3. arm+linux 裸机环境搭建之安装工具篇(eclipse)

    之前已经讲述如何安装gcc和gdb,在此不赘述! 一.所需要的软件有两个: jre-7u25-linux-i586.rpm(虚拟机) eclipse-cpp-kepler-R-linux-gtk .t ...

  4. Iframe和父窗口互调方法的集合

    1.子iframe里调用父级的方法:window.parent.document.   2.父级里调用子集iframe:window.frames["iframe_text"].d ...

  5. 对js中prototype的理解

    一直不理解child.prototype = new Parent()和child.prototype =Parent.prototype的区别,到现在为止,我觉得它俩最大的区别就是:前者共享构造器里 ...

  6. 超级强大的SVG SMIL animation动画详解

    本文花费精力惊人,具有先驱前瞻性,转载规则以及申明见文末,当心予以追究.本文地址:http://www.zhangxinxu.com/wordpress/?p=4333 //zxx: 本文的SVG在有 ...

  7. android开发获取网络状态,wifi,wap,2g,3g.工具类(一)

    android开发获取网络状态整理: package com.gzcivil.utils; import android.content.Context; import android.net.Con ...

  8. [Linked List]Linked List Cycle,Linked List Cycle II

    一.Linked List Cycle Total Accepted: 85115 Total Submissions: 232388 Difficulty: Medium Given a linke ...

  9. Javascript中undefined,NaN等特殊比较

    以下内容转自: http://blog.csdn.net/hongweigg/article/details/38090093 1.问题:在Javascript中,typeof(undefined) ...

  10. Android Activity之 setContentView()总结

    从一开始hello world的第一个安卓应用开始,Activity 自动生成,布局自动生成,直接修改布局,在Activity中,findviewById()找到view,然后处理相应的业务逻辑即可, ...