说明,是拜读 <JVM高级特性与最佳实践> 以后的笔记而已,基本上只是做一个记录..
package com.taobao.jvm;
public class FinalizeEscape {
public static FinalizeEscape FC = null;
@Override
protected void finalize() throws Throwable {
super.finalize();
System.out.println("finalize method invoke");
FC = this;
}
public static void main(String[] args) throws Exception {
FC = new FinalizeEscape();
FC = null;
System.gc();
Thread.sleep(500);
if(FC != null)
System.out.println("i am alive");
else
System.out.println("i am dead");
FC = null;
System.gc();
Thread.sleep(500);
if(FC != null)
System.out.println("i am alive");
else
System.out.println("i am dead");
}
}
执行的结果是
console输出 写道
finalize method invoke
i am alive
i am dead
解释:
1 很多教科书上说判断对象是否存活的算法是这样的:给对象添加一个引用计数器,当又一个地方引用他是,计数器+1.引用失效时,则-1.引用为0则回收..但是,其实这种引用计数算法并没有被JAVA采用..JAVA采用的是根搜索算法.
2 jvm在执行垃圾回收的时候会有两个步骤
(1)如果对象没有被引用,则进行第一次标记,然后还做另外一个操作,判断是否需要执行该对象的finalize方法.判断的条件是:该对象有没重写finalize方法.如果没有被重写,则不执行.如果该对象重写了finalize方法,但是已经被虚拟机调用过一次,则也不执行
如果该对象需要被执行finalize方法,则会被放入到一个低优先级队列中,虚拟机会自动开一个线程去执行这个队列.这也是为什么上面在system.gc后还要sleep 500毫秒的原因.
(2)GC会对在队列中对象记性二次标记,如果对象没有在finalize方法中拯救自己,则离死不远了.
3 有些人会怀疑
System.gc();
这个方法调用JVM的GC不保证一定能执行GC.这个我通过打印GC信息得到验证,至少在这个程序中,gc是保证被执行的.
[GC 317K->224K(60864K), 0.0006300 secs]
[Full GC 224K->158K(60864K), 0.0040963 secs]
finalize method invoke
i am alive
[GC 793K->190K(60864K), 0.0001947 secs]
[Full GC 190K->158K(60864K), 0.0048994 secs]
i am dead
4 作者说:finalize方法是JAVA刚诞生的时候对C/C++的一种妥协.所以,忘掉他吧..虽然他能给对象一个最后拯救自己的机会.
分享到:
相关推荐
《JVM高级特性与最佳实践(第2版)》是一本深入探讨Java虚拟机(JVM)技术的书籍,其源代码提供了丰富的实践案例和示例,帮助读者更直观地理解JVM的工作原理和优化技巧。以下是根据书名和描述所涉及的一些关键知识点...
《深入理解Java虚拟机JVM高级特性与最佳实践》是一本专注于Java开发人员提升技术水平的著作,由周志明撰写。这本书旨在填补Java技术体系中关于Java虚拟机(JVM)知识的空白,帮助读者深入理解JVM的工作原理及其对...
《JVM高级特性与最佳实践》一书涵盖了Java虚拟机(JVM)的深度解析以及在实际应用中的优化策略。JVM是Java程序运行的基础,它负责解释和执行字节码,提供内存管理、垃圾回收等核心功能。深入理解JVM的内部机制,对于...
《JVM高级特性与最佳实践(第2版)》是一本深入探讨Java虚拟机的专著,涵盖了JVM的重要概念、特性和优化策略。这本书旨在帮助开发者理解和掌握JVM的工作原理,从而提升Java应用程序的性能和稳定性。源码的提供则使得...
综上所述,了解和掌握JVM的高级特性与最佳实践对于保证Java应用的性能至关重要。从内存管理到垃圾回收,再到线程调度,每一项都是影响性能的关键因素。通过对JVM性能瓶颈的深入理解和针对性能问题的调优技巧,可以...
《JVM高级特性与最佳实践2.0》是关于Java虚拟机(JVM)的一本深入解析书籍,主要面向对Java性能优化、JVM内部机制感兴趣的开发者和运维人员。本书内容丰富,涵盖了JVM的各个方面,包括内存管理、类加载机制、垃圾...
《JVM高级特性与最佳实践》第二版源代码是一份宝贵的学习资源,涵盖了Java虚拟机的深入理解和优化技巧。这份源代码提供了多个章节的内容,包括第1章至第11章,让读者能够通过实际代码深入理解JVM的工作原理和实践...
标题 "框架->java语言->jvm->os->汇编->硬件" 描述了一条技术学习路径,从上至下深入理解软件开发的核心技术栈。这个路径涵盖了从应用框架到底层硬件的关键环节,让我们逐步解析其中涉及的知识点: 1. **框架**:...
《JVM高级特性与最佳实践(第二版)》这本书是一本详细介绍Java虚拟机(JVM)的高级特性和最佳实践的书籍。本书涵盖了JVM的内存模型、垃圾回收机制、性能调优以及在不同场景下的使用技巧等关键内容。通过阅读这本书...
读书笔记:《深入理解Java虚拟机JVM高级特性与最佳实践》笔记和理解。本笔记主要以图的形式记录。
读书笔记:深入理解Java虚拟机JVM高级特性与最佳实践第3版学习笔记
读书笔记:深入理解Java虚拟机 JVM高级特性与最佳实践第二章笔记
读书笔记:深入理解Java虚拟机JVM高级特性与最佳实践
读书笔记:深入理解Java虚拟机 JVM高级特性与最佳实践
读书笔记:深入理解Java虚拟机JVM高级特性与最佳实践第3版 周志明 学习笔记
读书笔记:深入理解Java虚拟机 JVM高级特性与最佳实践第3版
读书笔记:深入理解java虚拟机JVM高级特性与最佳实践中代码
读书笔记:深入理解Java虚拟机JVM高级特性与最佳实践代码实现