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!
相关推荐
### JVM学习笔记(一) #### 一、JVM概述与工具使用 JVM(Java Virtual Machine)是Java语言的核心组成部分之一,它为Java程序提供了一个跨平台的运行环境。本篇学习笔记主要介绍如何利用一系列工具来查看和监控JVM...
Java面向对象编程是Java语言的核心特性,它基于面向对象编程(OOP)理论,使得代码更易于理解、维护和重用。本章整理的笔记主要涵盖了以下几个关键知识点: 1. **Java简介**: Java是一种跨平台的、开源的、高性能...
### 韩顺平编写的Java学习笔记概览 #### Java平台分类与运行机制 - **J2SE(Java 2 Platform, Standard Edition)**: 标准版Java开发平台,适用于桌面应用程序开发。 - **J2EE(Java 2 Platform, Enterprise ...
2. **类与对象**:Java是面向对象的语言,类是对象的模板,而对象是类的实例。类包含属性(成员变量)和方法(函数)。理解封装、继承和多态是Java面向对象编程的关键概念。 3. **数组与集合**:数组用于存储固定...
### Java学习笔记及心得知识点详细解析 #### 标题:Java学习笔记及心得 #### 描述:Core Java 学习笔记及心得 pdf格式可打开。涵盖了java的基础入门知识,非常适合自学的及想深入学习理解的同学。 #### 标签:...
通过阅读《深入理解Java虚拟机》第三章,开发者不仅可以深入理解Java的安全机制,还能学习到如何在实际项目中实施这些安全策略,提升应用的安全性。对于想要从事Java开发或者对系统安全有深入了解需求的人来说,这一...
这份“Java学习笔记”是为初学者准备的,旨在帮助他们快速掌握Java的基础知识。笔记中可能涵盖了以下重要知识点: 1. **Java简介**:Java是由Sun Microsystems(现已被Oracle收购)开发的,它的设计目标是“一次...
### Java学习笔记知识点总结 #### 第一章:Java语言入门 - **1.1 Java的诞生** Java由Sun Microsystems公司于1995年推出的一种可移植、面向对象的编程语言。最初的设计目标是为消费电子产品提供一种通用编程语言...
总的来说,"深入理解Java虚拟机读书笔记之:第3章 安全(2)"主要涵盖了Java安全体系的核心概念,包括类加载器、权限模型、安全管理器以及相关工具的使用。理解这些内容对于任何希望构建安全、可靠的Java应用程序的...
Java虚拟机(JVM)是Java程序运行的基础,它的历史发展和内存回收机制是Java开发者必须深入了解的关键领域。本文将详细探讨JVM的发展历程以及内存管理中的垃圾回收机制。 一、JVM的历史发展 1. **早期阶段**:1995...
6. **跨平台性**:Java的一个重要特性就是“编写一次,到处运行”(Write Once Run Anywhere, WORA),这得益于Java的运行机制——Java程序被编译成字节码(Bytecode),然后由Java虚拟机(JVM)解释执行。...
### Java基础学习笔记知识点 #### 一、Java学习路线概览 Java学习通常分为几个阶段,从基础到高级,逐步深化。以下是对给定文件中提到的学习路线的详细解析: ##### 第一阶段:Java基础 - **JAVASE**:Java标准版...
"JAVA面向对象编程(孙卫琴)_3java操作符1.doc"和"JAVA面向对象编程(孙卫琴)_3java操作符.doc"讲解了Java中的运算符,包括算术运算符、比较运算符、逻辑运算符、赋值运算符等。掌握这些运算符的用法对于编写复杂的...
Java学习笔记主要涉及Java语言的历史背景、语言特点、应用平台和学习建议。以下是对这些内容的详细解析: ### Java语言的历史背景 Java起源于1990年代初的Sun公司(现为Oracle公司的一部分)的“绿色项目”计划,...
2023年的"Java 基础 第1阶段:基本语法——尚硅谷学习笔记(含面试题)"涵盖了从环境搭建到程序设计的基本要素,旨在帮助学习者系统地理解并应用Java语言。 一、Java环境搭建 在开始Java编程之前,你需要安装Java ...
#### 第三章:Java类和对象 **一、面向对象初步** 面向对象编程的核心概念包括类、对象、封装、继承和多态。 **二、面向对象三大特征** 1. **封装**:隐藏对象的实现细节。 2. **继承**:子类继承父类的属性和...
《Java JDK 7学习笔记》详细介绍了JVM、JRE、Java SE API、JDK与IDE之间的对应关系。必须要时从Java SE API的源代码分析,了解各种语法在Java SE API中如何应用。 《Java JDK 7学习笔记》将IDE操作纳为教学内容...
【Java学习笔记】是针对Java编程语言的一份详尽的学习资料,主要由“圣思源”提供,旨在帮助初学者和进阶者深入理解和掌握Java技术。这份笔记可能包含了从基础语法到高级特性的全面讲解,结合了理论与实践,通过实例...