3.2.2 根搜索算法
在主流的商用程序语言中(Java和C#,甚至包括前面提到的古老的Lisp),都是使用根搜索算法(GC Roots Tracing)判定对象是否存活的。这个算法的基本思路就是通过一系列的名为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连(用图论的话来说就是从GC Roots到这个对象不可达)时,则证明此对象是不可用的。如图3-1所示,对象object 5、object 6、object 7虽然互相有关联,但是它们到GC Roots是不可达的,所以它们将会被判定为是可回收的对象。
在Java语言里,可作为GC Roots的对象包括下面几种:
虚拟机栈(栈帧中的本地变量表)中的引用的对象。
方法区中的类静态属性引用的对象。
方法区中的常量引用的对象。
本地方法栈中JNI(即一般说的Native方法)的引用的对象。
图3-1 根搜索算法判定对象是否可回收 |
3.2.4 对象生存还是死亡?
1、流程图
注:一个对像的finallize()方法只会被执行一次,意味着对象只能使用finallize方法自救一次
2、一段java代码,验证对象是否死亡的过程
package com.ru.jvm.gc; /** * * 类描述:jvm判断对象生死 * @since jdk1.7 * @version 1.0 */ public class FinallizeGc { private static FinallizeGc fg = null; public void isActive(){ System.out.println("我还活着"); } /** * 一个对象只会执行一次finallize方法 */ @Override protected void finalize() throws Throwable { System.out.println("第一次标记:执行finallize方法。进行自救,使fg指向当前对象。"); fg = this; } @SuppressWarnings("static-access") public static void main(String[] args) throws InterruptedException { fg = new FinallizeGc(); //测试第一次垃圾回收 fg = null; //手动垃圾回收 System.gc(); //判断对象受否存货 System.out.println("第一次垃圾回收自救结果:"); //因为finallizer线程优先级较低,当前线程暂停1秒,等待finallizer执行 Thread.currentThread().sleep(1000); if(fg != null){ fg.isActive(); }else{ System.out.println("I am die!"); } //测试第二次垃圾回收 fg = null; //手动垃圾回收 System.gc(); //判断对象受否存货 System.out.println("第二次垃圾回收自救结果:"); Thread.currentThread().sleep(1000); if(fg != null){ fg.isActive(); }else{ System.out.println("I am die!"); } } }
执行结果:
第一次垃圾回收自救结果: 第一次标记:执行finallize方法。进行自救,使fg指向当前对象。 我还活着 第二次垃圾回收自救结果: I am die!
相关推荐
《Java JDK 7学习笔记》详细介绍了JVM、JRE、Java SE API、JDK与IDE之间的对应关系。必须要时从Java SE API的源代码分析,了解各种语法在Java SE API中如何应用。 《Java JDK 7学习笔记》将IDE操作纳为教学内容...
10.java安装时要理解这三个东西,安装是否成功输入java 命令测试一下工具是否可用。 11.java安装目录详解https://zhidao.baidu.com/question/181908777.html 12.习题...
JVM的重要性不言而喻,这个是学习JVM是看视频和读《深入理解JVM》时做的一些笔记,用于复习参考。 读书笔记 第2章:java内存模型和内存溢出异常 1.运行时数据区域 1.程序计数器:线程私有 2.java虚拟机栈:线程私有...
java虚拟机源码学习 Understanding the JVM 深入理解Java虚拟机第三版 (周志明)源码及学习笔记
引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。 [Page] 39.启动一个线程是用run()还是start()? 答:启动一个线程是调用start()方法,使线程所代表的虚拟处理机...
语言相关的API,第三方库和计算机基础理论等知识的学习和整理 更多 : | | 目录 资源 详细目录 Java语言和JDK源码 Java语言的基础理论知识 并发编程 Java并发编程相关的内容,并发包源码分析等 集合框架 Java集合框架...
Java学习笔记,内容包括JVM,spring,hashMap实现内核分析,多线程,剑指offer题解,设计模式。然后根据面试的重点,又将很多从里面抽出,专门整了个面试的分类,如果是看面试的东西的话,可以重点看这个。 编码字...
Notebook 欢迎你来到我的笔记本 本github中写的都是笔记记录,其中内容大部分来源于网上优秀博文或者经典书籍,因此不推荐阅读我的笔记,只是我个人使用为主...第3章:抽象队列同步器 第4章:并发与集合总结 第5章:Has
目标 很想知道,这家伙,在这条路上,能走多远! 问你敢不敢!趁年轻,做自己想做的事 短期目标 面向RMB(面试)学习 ...第三遍在替代笔记的替代下,想想用自己的语言怎么把知识点有体系的表达出来。 先戳穿
Go语言学习笔记_雨痕 go-internals-zh steal 图解HTTP+彩色版 深入理解JVM&G1GC Java并发编程的艺术 java并发编程实战pdf及源码 Java虚拟机(第二版) 实战JAVA虚拟机JVM故障诊断与性能优化 HotSpot实战 Java虚拟机...
当然,现在用过的东西并不是代表以后还能娴熟的使用,做好笔记非常重要; 1:必须明白为什么要使用线程池:(这点很重要) a:手上项目所需,因为项目主要的目的是实现多线程的数据推送;需要创建多线程的话,那...
第2章 一切都是对象 1.在使用任何引用前,都必须为其指定一个对象,如果试图访问一个为null的引用,将会报错。 2.java有一个垃圾回收器,用来监视所有new创建的对象,并辨别那些不在被引用的对象,释放这些对象的...
│ 淘淘商城第三天笔记.docx │ ├─04.第四天 │ 01.第三天内容复习.avi │ 02.课程计划.avi │ 03.富文本编辑器的使用.avi │ 04.商品添加功能-分析.avi │ 05.商品添加功能实现.avi │ 06.规格参数介绍及实现...
由于采纳第一张方法,第二种跟第三种实现只贴了关键代码,望谅解。^_^ public boolean lock_2(long timeout) { long nano = System.nanoTime(); timeout *= ONE_MILLI_NANOS; try { while ((System.nanoTime() ...