根搜索算法中不可达对象在回收之前,要进行二次标记。
第一次标记时会进行一次筛选:筛选的条件是是否有必要执行finalize()方法。
当对象没有覆盖finalize()方法,或者finalize()被虚拟机调用过,则虚拟机认为没有必要执行finalize()方法。
如果这个对象有必要执行finalize(),则会放在一个队列里,以一个低优先级的线程进行执行finalize()方法进行二次标记,如果在finalize()方法中,对象重新回到引用链上(比如this赋值给其他引用链上的对象),则该对象不被回收,而移出该队列。
注意:finalize()方法只被调用一次,如果这个对象在GC时被调用过一次finalize()方法,则第二次GC的时候,就会被判断为没有必要执行finalize()而被直接回收。
另外finalize()能做的所有工作,都可以通过try-finally更好、更及时的解决。所以请忘掉finalize().
package System.gc;
/**
* @author piaohailin
* @date 2013-12-28
*/
public class TestGc {
public static TestGc HOOK;
@Override
protected void finalize() throws Throwable {
super.finalize();
TestGc.HOOK = this;
System.out.println("finalize");
}
/*
输出结果
finalize
HOOK is alvie
HOOK is dead
*/
public static void main(String[] args) throws Exception {
HOOK = new TestGc();
HOOK = null;
System.gc();//第一次GC,符合有必要要执行finalize的条件
Thread.sleep(1000);//Finalizer线程优先级较低,所以要等一会
if (HOOK != null) {
System.out.println("HOOK is alvie");
} else {
System.out.println("HOOK is dead");
}
HOOK = null;
System.gc();//第二次GC,因为已经执行过一次finalize,所以没有必要进行二次标记
Thread.sleep(1000);//Finalizer线程优先级较低,所以要等一会
if (HOOK != null) {
System.out.println("HOOK is alvie");
} else {
System.out.println("HOOK is dead");
}
}
}
分享到:
相关推荐
MAT JVM内存分析工具可以帮助开发者深入理解Java虚拟机(JVM)的内存管理机制,通过分析堆内存快照来识别内存消耗异常的情况。 首先,MAT提供了丰富的视图来帮助用户查看内存状态,例如“概述”视图可以快速了解堆...
MAT,全称Memory Analyzer Tool,是IBM开发的一款强大的Java虚拟机(JVM)内存分析工具,尤其适用于Mac OS X平台。这款工具可以帮助开发者诊断和解决Java应用中的内存泄漏问题,提高应用性能。MAT通过深入分析堆转储...
【Jvm 内存分析文档】 Java 虚拟机(JVM)是Java程序的核心运行环境,它负责管理和执行字节码。JVM内存管理主要包括内存结构、内存分配以及垃圾回收(GC)等方面。了解这些知识对于优化Java应用程序的性能至关重要...
IntelliJ IDEA(简称Idea)作为广受欢迎的Java集成开发环境,提供了一系列强大的工具来帮助开发者进行性能调优,其中就包括JProfiler11这款强大的JVM内存分析工具。本文将详细介绍如何使用Idea中的JProfiler11插件,...
MAT,全称Memory Analyzer Tool,是IBM开发的一款强大的Java虚拟机(JVM)内存分析工具。它主要用于诊断Java应用程序的内存泄漏问题,帮助开发者理解内存消耗情况,优化内存配置,从而提升应用性能。MAT以其易用性和...
MAT,全称Memory Analyzer Tool,是IBM开发的一款强大的JVM内存分析工具,尤其适用于诊断Java应用程序的内存泄漏问题。在Java开发过程中,内存溢出(Out Of Memory)问题常常会导致程序异常终止,而MAT就是解决这类...
标题 "JVM 内存分析" 涉及到的是Java虚拟机(JVM)的内存管理,这是Java性能优化的重要部分。JVM为应用程序提供了运行时环境,它包括堆内存、栈内存、方法区、程序计数器以及本地方法栈等几个主要区域。以下是对这些...
IBM HeapAnalyzer是一款强大的Java虚拟机(JVM)内存分析工具,专为诊断和解决Java应用程序的内存泄漏问题而设计。这个工具能够帮助开发者深入理解Java应用程序的内存使用情况,从而优化性能并防止由于内存泄漏导致...
JVM 内存溢出问题解析 JVM 内存溢出是指程序运行所需的内存大于虚拟机能提供的最大内存的情况。这种情况可能是由于数据量过大、死循环、静态变量和静态方法过多、递归、无法确定是否被引用的对象等原因引起的。同时...
JVM(Java虚拟机)内存模型主要由以下几个部分组成:程序计数器、Java虚拟机栈、本地方法栈、Java堆以及方法区(在JDK 8之后称为元空间)。下面将对这几个部分进行详细介绍。 #### 二、程序计数器 程序计数器是一...
【ha456.jar(IBMHeapAnalyzer)JVM内存分析工具】是一款由IBM开发的专业工具,主要用于诊断Java虚拟机(JVM)的内存问题。它能够解析和分析JVM生成的内存转储文件(通常称为heap dump或hprof文件),帮助开发者识别...
在这份由Sun Microsystems公司出版的《JVM内存管理白皮书》中,我们可以找到关于Java虚拟机(JVM)内存管理的详细介绍和深入分析。这份文档对于想要深入了解JVM工作原理的读者来说是一份宝贵的学习资料。在这份...
性能测试,线程的 dump 看到线程的 死锁,等待 运行状态
1. JVisualVM:提供内存分析、线程监控、CPU性能分析等功能。 2. JConsole:监控JVM的性能和内存状态。 3. jinfo、jmap、jhat:命令行工具用于获取JVM配置、堆转储、堆分析等。 五、内存泄漏与检测 1. 内存泄漏...
当出现OOM(OutOfMemory)错误时,往往意味着JVM无法为新的对象分配内存,这时就需要借助专业的内存分析工具进行诊断。IBM提供的ga456、ha456与jca457工具就是这样的利器,它们可以帮助开发者深入理解JVM内存的使用...
本文将深入探讨 VisualVM 及其集成的一系列命令行工具,包括 jps、jstat、jmap、jinfo、jstack 和 JConsole,帮助读者掌握 JVM 内存监控的核心技巧。 #### VisualVM:JVM 监控的全能工具 VisualVM 是一款功能强大...
MAT(Memory Analyzer Tool)是IBM开发的一款强大的Java虚拟机(JVM)内存分析工具,它可以帮助开发者诊断和解决Java应用程序的内存泄漏问题,优化内存使用效率。MAT以其丰富的功能、直观的用户界面以及详尽的分析...
MAT,全称Memory Analyzer Tool,是IBM开发的一款强大的Java虚拟机(JVM)内存分析工具。它被广泛用于诊断和解决Java应用程序中的内存泄漏、内存消耗过高以及性能问题。MAT提供了一种直观的方式来查看和理解堆内存的...
本系列课程从JVM基础到高级实战,老师手把手教你如何进行JVM调优,思路清晰,没有废话,旨在挑战高薪。 课程亮点: 1、基于阿里arthas进行JVM调优; 2、基于代码排查OOM问题,拒绝空讲; 3、总结JVM通用的调优思路;...