`
退役的龙弟弟
  • 浏览: 451828 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

jvm学习笔记:第3章java判断对象是否死亡

    博客分类:
  • jvm
 
阅读更多

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!

 

 

  • 大小: 20.9 KB
分享到:
评论

相关推荐

    JVM学习笔记(一)

    ### JVM学习笔记(一) #### 一、JVM概述与工具使用 JVM(Java Virtual Machine)是Java语言的核心组成部分之一,它为Java程序提供了一个跨平台的运行环境。本篇学习笔记主要介绍如何利用一系列工具来查看和监控JVM...

    java面向对象和第一章整理笔记

    Java面向对象编程是Java语言的核心特性,它基于面向对象编程(OOP)理论,使得代码更易于理解、维护和重用。本章整理的笔记主要涵盖了以下几个关键知识点: 1. **Java简介**: Java是一种跨平台的、开源的、高性能...

    韩顺平编写的java学习笔记(全)

    ### 韩顺平编写的Java学习笔记概览 #### Java平台分类与运行机制 - **J2SE(Java 2 Platform, Standard Edition)**: 标准版Java开发平台,适用于桌面应用程序开发。 - **J2EE(Java 2 Platform, Enterprise ...

    Java基础尚硅谷宋红康学习笔记

    2. **类与对象**:Java是面向对象的语言,类是对象的模板,而对象是类的实例。类包含属性(成员变量)和方法(函数)。理解封装、继承和多态是Java面向对象编程的关键概念。 3. **数组与集合**:数组用于存储固定...

    深入理解Java虚拟机读书笔记之:第3章 安全(3)

    通过阅读《深入理解Java虚拟机》第三章,开发者不仅可以深入理解Java的安全机制,还能学习到如何在实际项目中实施这些安全策略,提升应用的安全性。对于想要从事Java开发或者对系统安全有深入了解需求的人来说,这一...

    Java学习笔记(整理)

    这份“Java学习笔记”是为初学者准备的,旨在帮助他们快速掌握Java的基础知识。笔记中可能涵盖了以下重要知识点: 1. **Java简介**:Java是由Sun Microsystems(现已被Oracle收购)开发的,它的设计目标是“一次...

    java学习笔记.pdf

    ### Java学习笔记知识点总结 #### 第一章:Java语言入门 - **1.1 Java的诞生** Java由Sun Microsystems公司于1995年推出的一种可移植、面向对象的编程语言。最初的设计目标是为消费电子产品提供一种通用编程语言...

    深入理解Java虚拟机读书笔记之:第3章 安全(2)

    总的来说,"深入理解Java虚拟机读书笔记之:第3章 安全(2)"主要涵盖了Java安全体系的核心概念,包括类加载器、权限模型、安全管理器以及相关工具的使用。理解这些内容对于任何希望构建安全、可靠的Java应用程序的...

    JVM历史发展和内存回收笔记

    Java虚拟机(JVM)是Java程序运行的基础,它的历史发展和内存回收机制是Java开发者必须深入了解的关键领域。本文将详细探讨JVM的发展历程以及内存管理中的垃圾回收机制。 一、JVM的历史发展 1. **早期阶段**:1995...

    java第一章笔记

    6. **跨平台性**:Java的一个重要特性就是“编写一次,到处运行”(Write Once Run Anywhere, WORA),这得益于Java的运行机制——Java程序被编译成字节码(Bytecode),然后由Java虚拟机(JVM)解释执行。...

    java基础学习笔记

    ### Java基础学习笔记知识点 #### 一、Java学习路线概览 Java学习通常分为几个阶段,从基础到高级,逐步深化。以下是对给定文件中提到的学习路线的详细解析: ##### 第一阶段:Java基础 - **JAVASE**:Java标准版...

    JAVA面向对象编程(孙卫琴)学习笔记

    "JAVA面向对象编程(孙卫琴)_3java操作符1.doc"和"JAVA面向对象编程(孙卫琴)_3java操作符.doc"讲解了Java中的运算符,包括算术运算符、比较运算符、逻辑运算符、赋值运算符等。掌握这些运算符的用法对于编写复杂的...

    JAVA学习笔记-良葛格

    Java学习笔记主要涉及Java语言的历史背景、语言特点、应用平台和学习建议。以下是对这些内容的详细解析: ### Java语言的历史背景 Java起源于1990年代初的Sun公司(现为Oracle公司的一部分)的“绿色项目”计划,...

    Java 基础 第1阶段:基本语法-尚硅谷学习笔记(含面试题) 2023年

    2023年的"Java 基础 第1阶段:基本语法——尚硅谷学习笔记(含面试题)"涵盖了从环境搭建到程序设计的基本要素,旨在帮助学习者系统地理解并应用Java语言。 一、Java环境搭建 在开始Java编程之前,你需要安装Java ...

    java私塾学习笔记整理

    #### 第三章:Java类和对象 **一、面向对象初步** 面向对象编程的核心概念包括类、对象、封装、继承和多态。 **二、面向对象三大特征** 1. **封装**:隐藏对象的实现细节。 2. **继承**:子类继承父类的属性和...

    Java JDK 7学习笔记(国内第一本Java 7,前期版本累计销量5万册)

     《Java JDK 7学习笔记》详细介绍了JVM、JRE、Java SE API、JDK与IDE之间的对应关系。必须要时从Java SE API的源代码分析,了解各种语法在Java SE API中如何应用。  《Java JDK 7学习笔记》将IDE操作纳为教学内容...

    java学习笔记

    【Java学习笔记】是针对Java编程语言的一份详尽的学习资料,主要由“圣思源”提供,旨在帮助初学者和进阶者深入理解和掌握Java技术。这份笔记可能包含了从基础语法到高级特性的全面讲解,结合了理论与实践,通过实例...

Global site tag (gtag.js) - Google Analytics