JVM垃圾回收之finalize

JVM的一个很重要的功能是GC机制(垃圾回收机制),不知道大家有没有了解一点C语言,传统的C语言编程主要使用free()进行垃圾回收,试想一下,如果你使用完变量忘记调用free()方法,那么一个系统调用这个方法就会产生不能销毁的垃圾,系统很快就会崩掉,Java的GC机制会自动回收垃圾,但是垃圾回收不是立马进行的,在垃圾回收之前JVM会调用finalize(),我们可以重写finalize()方法再做一些被回收之前要做的事情。
实验验证代码如下:

package learnIng;

public class GC {  

    public static GC SAVE_HOOK = null;  

    public static void main(String[] args) throws InterruptedException {  
        SAVE_HOOK = new GC();  
        SAVE_HOOK = null;  
        System.gc();  
        Thread.sleep(500);  
        if (null != SAVE_HOOK) { //此时对象应该处于(reachable, finalized)状态  
            System.out.println("Yes , I am still alive");  
        } else {  
            System.out.println("No , I am dead");  
        }  
        SAVE_HOOK = null;  
        System.gc();  
        Thread.sleep(500);  
        if (null != SAVE_HOOK) {  
            System.out.println("Yes , I am still alive");  
        } else {  
            System.out.println("No , I am dead");  
        }  
    }  

    @Override  
    protected void finalize() throws Throwable {  
        super.finalize();  
        System.out.println("execute method finalize()");  
        SAVE_HOOK = this;  
    }  
}  

实验结果:
execute method finalize()
Yes , I am still alive
No , I am dead
如果我们不让线程睡眠,那么会出现什么情况?
实验代码如下:

package learnIng;

public class GC {  

    public static GC SAVE_HOOK = null;  

    public static void main(String[] args) throws InterruptedException {  
        SAVE_HOOK = new GC();  
        SAVE_HOOK = null;  
        System.gc();  
//        Thread.sleep(500);  
        if (null != SAVE_HOOK) { //此时对象应该处于(reachable, finalized)状态  
            System.out.println("Yes , I am still alive");  
        } else {  
            System.out.println("No , I am dead");  
        }  
        SAVE_HOOK = null;  
        System.gc();  
        Thread.sleep(500);  
        if (null != SAVE_HOOK) {  
            System.out.println("Yes , I am still alive");  
        } else {  
            System.out.println("No , I am dead");  
        }  
    }  

    @Override  
    protected void finalize() throws Throwable {  
        super.finalize();  
        System.out.println("execute method finalize()");  
        SAVE_HOOK = this;  
    }  
}  

实验结果如下:
No , I am dead
execute method finalize()
Yes , I am still alive
当我们调用system.gc的时候,JVM并没有立即进行垃圾回收,只是提醒JVM应该进行垃圾回收,所以我们在编程的时候,尽量把不用的变量赋值为null,让JVM自己去进行垃圾回收。

<p style="color: #676767; font-size: 14px; background-color: #ffffff;"><strong><span style="color: #008781; font-size: 16px;">为什么要学JVM</span></strong></p> <p style="color: #676767; background-color: #ffffff;"><span style="color: #676767;"><span style="font-size: 14px;">1、一切JAVA代码都运行在JVM之上,只有深入理解虚拟机才能写出更强大的代码,解决更深层次的问题。</span></span></p> <p style="color: #676767; background-color: #ffffff;"><span style="color: #676767;"><span style="font-size: 14px;">2、JVM是迈向高级工程师、架构师的必备技能,也是高薪、高职位的不二选择。</span></span></p> <p style="color: #676767; background-color: #ffffff;"><span style="color: #676767;"><span style="font-size: 14px;">3、同时,JVM又是各大软件公司笔试、面试的重中之重,据统计,头部的30家互利网公司,均将JVM作为笔试面试的内容之一。</span></span></p> <p style="color: #676767; background-color: #ffffff;"><span style="color: #676767;"><span style="font-size: 14px;">4、JVM内容庞大、并且复杂难学,通过视频学习是最快速的学习手段。</span></span></p> <p style="color: #676767; font-size: 14px; background-color: #ffffff;"><strong><span style="color: #008781; font-size: 16px;">课程介绍</span></strong></p> <p style="color: #676767; font-size: 14px; background-color: #ffffff;"><span style="color: #676767;"><span style="font-size: 14px;">本课程包含11个大章节,总计102课时,无论是笔试、面试,还是日常工作,可以让您游刃有余。</span></span></p> <p style="color: #676767; font-size: 14px; background-color: #ffffff;"><span style="color: #676767;"><span style="font-size: 14px;"><img src="https://img-bss.csdnimg.cn/202105152200003850.png" alt="" /></span></span></p> <p style="color: #676767; font-size: 14px; background-color: #ffffff;"><span style="color: #676767;"><span style="font-size: 14px;">第1章 基础入门,从JVM是什么开始讲起,理解JDK、JRE、JVM的关系,java的编译流程和执行流程,让您轻松入门。</span></span></p> <p style="color: #676767; font-size: 14px; background-color: #ffffff;"><span style="color: #676767;"><span style="font-size: 14px;">第2章 字节码文件,深入剖析字节码文件的全部组成结构,以及javap和jbe可视化反解析工具的使用。</span></span></p> <p style="color: #676767; font-size: 14px; background-color: #ffffff;"><span style="color: #676767;"><span style="font-size: 14px;">第3章 类的加载、解释、编译,本章节带你深入理解类加载器的分类、范围、双亲委托策略,自己手写类加载器,理解字节码解释器、即时编译器、混合模式、热点代码检测、分层编译等核心知识。</span></span></p> <p style="color: #676767; font-size: 14px; background-color: #ffffff;"><span style="color: #676767;"><span style="font-size: 14px;">第4章 内存模型,本章节涵盖JVM内存模型的全部内容,程序计数器、虚拟机栈、本地方法栈、方法区、永久代、元空间等全部内容。</span></span></p> <p style="color: #676767; font-size: 14px; background-color: #ffffff;"><span style="color: #676767;"><span style="font-size: 14px;">第5章 对象模型,本章节带你深入理解对象的创建过程、内存分配的方法、让你不再稀里糊涂。</span></span></p> <p style="color: #676767; font-size: 14px; background-color: #ffffff;"><span style="color: #676767;"><span style="font-size: 14px;">第6章 GC基础,本章节是垃圾回收的入门章节,带你了解GC回收的标准是什么,什么是可达性分析、安全点、安全区,四种引用类型的使用和区别等等。</span></span></p> <p style="color: #676767; font-size: 14px; background-color: #ffffff;"><span style="color: #676767;"><span style="font-size: 14px;">第7章 GC算法与收集器,本章节是垃圾回收的重点,掌握各种垃圾回收算法,分代收集策略,7种垃圾回收器的原理和使用,垃圾回收器的组合及分代收集等。</span></span></p> <p style="color: #676767; font-size: 14px; background-color: #ffffff;"><span style="color: #676767;"><span style="font-size: 14px;">第8章 GC日志详解,各种垃圾回收器的日志都是不同的,怎么样读懂各种垃圾回收日志就是本章节的内容。</span></span></p> <p style="color: #676767; font-size: 14px; background-color: #ffffff;"><span style="color: #676767;"><span style="font-size: 14px;">第9章 性能监控与故障排除,本章节实战学习jcmd、jmx、jconsul、jvisualvm、JMC、jps、jstatd、jmap、jstack、jinfo、jprofile、jhat总计12种性能监控和故障排查工具的使用。</span></span></p> <p style="color: #676767; font-size: 14px; background-color: #ffffff;"><span style="color: #676767;"><span style="font-size: 14px;">第10章 阿里巴巴Arthas在线诊断工具,这是一个特别小惊喜,教您怎样使用当前最火热的arthas调优工具,在线诊断各种JVM问题。</span></span></p> <p style="color: #676767; font-size: 14px; background-color: #ffffff;"><span style="color: #676767;"><span style="font-size: 14px;">第11章 故障排除,本章会使用实际案例讲解单点故障、高并发和垃圾回收导致的CPU过高的问题,怎样排查和解决它们。</span></span></p> <p style="color: #676767; font-size: 14px; background-color: #ffffff;"><strong><span style="color: #008781; font-size: 16px;">课程资料</span></strong></p> <p style="color: #676767; background-color: #ffffff;"><span style="color: #676767;"><span style="font-size: 14px;">课程附带配套项目源码2个</span></span></p> <p style="color: #676767; background-color: #ffffff;"><span style="color: #676767;"><span style="font-size: 14px;">159页高清PDF理论篇课件1份</span></span></p> <p style="color: #676767; background-color: #ffffff;"><span style="color: #676767;"><span style="font-size: 14px;">89页高清PDF实战篇课件1份</span></span></p> <p style="color: #676767; background-color: #ffffff;"><span style="color: #676767;"><span style="font-size: 14px;">Unsafe源码PDF课件1份</span></span></p> <p style="color: #676767; background-color: #ffffff;"><span style="color: #676767;"><span style="font-size: 14px;">class_stats字段说明PDF文件1份</span></span></p> <p style="color: #676767; background-color: #ffffff;"><span style="color: #676767;"><span style="font-size: 14px;">jcmd Thread.print解析说明文件1份</span></span></p> <p style="color: #676767; background-color: #ffffff;"><span style="color: #676767;"><span style="font-size: 14px;">JProfiler内存工具说明文件1份</span></span></p> <p style="color: #676767; background-color: #ffffff;"><span style="color: #676767;"><span style="font-size: 14px;">字节码可视化解析工具1份</span></span></p> <p style="color: #676767; background-color: #ffffff;"><span style="color: #676767;"><span style="font-size: 14px;">GC日志可视化工具1份</span></span></p> <p style="color: #676767; background-color: #ffffff;"><span style="color: #676767;"><span style="font-size: 14px;">命令行工具cmder 1份</span></span></p> <p style="color: #676767; font-size: 14px; background-color: #ffffff;"><strong><span style="color: #008781; font-size: 16px;">学习方法</span></strong></p> <p style="color: #676767; font-size: 14px; background-color: #ffffff;"><span style="color: #676767;"><span style="font-size: 14px;">理论篇部分推荐每天学习2课时,可以在公交地铁上用手机进行学习。</span></span></p> <p style="color: #676767; font-size: 14px; background-color: #ffffff;"><span style="color: #676767;"><span style="font-size: 14px;">实战篇部分推荐对照视频,使用配套源码,一边练习一遍学习。</span></span></p> <p style="color: #676767; font-size: 14px; background-color: #ffffff;"><span style="color: #676767;"><span style="font-size: 14px;">课程内容较多,不要一次性学太多,而是要循序渐进,坚持学习。</span></span></p> <p><img src="https://img-bss.csdnimg.cn/202103270814406060.jpg" alt="" /></p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p>
相关推荐
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页