一个Java程序:从初始化到终结的全览

164 阅读3分钟

前言

我们常听到有人问:“你了解Spring的生命周期吗?”我相信大家都是能回答的七七八八的。我当时看到这个问题的时候,我脑海里第一时间浮现的不是这个问题的答案,而是“简单讲一下一个Java程序的生命周期”这个问题,因为“简单讲一下Java程序的生命周期”这个问题是我之前,在学习Java之后,被一位很强的师兄问过的一个问题,那时候的自己就是一名仓促学习,对很多知识点都不清不楚的小白一枚,那时候的自己甚至都不知道师兄让我回答什么,之后这个问题我就一直记忆犹新,自己事后也重新的学习了这个知识点,今天就把当时的笔记重新回顾整理,这就是这篇文章的由来。

Snipaste_2025-03-03_16-07-13.png

1.编写.java文件

我们使用IDE或者直接在文本编辑器上写Java源代码,要有main()。下面是我们每个程序员都无比熟悉的一个Java编写的输出Hellow World的源代码。

pubile class Test{
    pubile static void main(String[] args){
        System.out.println("Hellow World");
    }
}

2.编译成.class文件

如果你要手动将.java文件编译成.class文件的话,使用命令行javac命令。如果使用IDE,它会帮我们直接处理好。生成的.class文件内是字节码指令,可以在任意的支持JVM的平台运行,这也是Java语言特别重要的可移植性的实现。

javac Test.java

3.JVM进行类加载

JVM使用类加载器来加载.class文件,将它转换成可以执行的类对象,加载器如下图所示:

Snipaste_2025-03-03_16-27-24.png

3.1 Bootstrap Class Loader

主要负责加载JDK核心类库,例如:java.util.*、java.lang.String等。 我们可以使用getClassLoader读取String的类加载器,但是因为该类不能被调,所有会返回null。

Snipaste_2025-03-03_16-44-42.png

3.2 Extension Class Loader

负责加载JDK下../lib/ext目录下的扩展类库。

Snipaste_2025-03-03_16-48-05.png

3.3 App Class Loader

负责加载应用程序的类,例如我们自己写的Java代码就是它加载的。

4.执行代码块和main()

我们都知道java中有许多执行顺序,在类加载的时候执行代码块和调用main()方法。

5.程序运行

程序开始会调用方法、分配对象空间等操作,JVM使用解释器解释并执行.class文件的字节码指令,然后JIT对频繁调用的热点代码,编译存储在本地,加快程序运行。

Snipaste_2025-03-03_17-07-59.png

6.垃圾回收

当程序终结时JVM会进行垃圾回收,释放不再使用的内存资源。

触发垃圾回收:垃圾回收器根据堆空间的使用情况触发垃圾请求。 可达性分析:通过根节点追踪对象。 标记和清除:标记可达对象和清除不可达对象。 分代收集:针对不同生命周期的对象采用不同的回收策略。 资源释放:关闭文件和网络等请求。 最终化:执行finalize()方法。

                            graph
                            A[程序结束]
                            B[触发垃圾回收]
                            C[可达性分析]
                            D[标记阶段]
                            E[清除阶段]
                            F[并发标记清除]
                            G[分代收集]
                            H[资源释放]
                            I[最终化]
                            J[程序终结]
                            A-->B
                            B-->C
                            C-->D
                            D-->E
                            E-->F
                            F-->G
                            G-->H
                            H-->I
                            I-->J

7.程序终结

所有线程结束,操作系统资源被释放,程序终结。

总结

写的有些不足之处,还请多多见谅。写文章是我最近开始为准备八股文开始的,一种自我回顾和巩固的过程,内容页都是以前学习的时候一零零散散的笔记整理和自己补充。