前言
我们常听到有人问:“你了解Spring的生命周期吗?”我相信大家都是能回答的七七八八的。我当时看到这个问题的时候,我脑海里第一时间浮现的不是这个问题的答案,而是“简单讲一下一个Java程序的生命周期”这个问题,因为“简单讲一下Java程序的生命周期”这个问题是我之前,在学习Java之后,被一位很强的师兄问过的一个问题,那时候的自己就是一名仓促学习,对很多知识点都不清不楚的小白一枚,那时候的自己甚至都不知道师兄让我回答什么,之后这个问题我就一直记忆犹新,自己事后也重新的学习了这个知识点,今天就把当时的笔记重新回顾整理,这就是这篇文章的由来。
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文件,将它转换成可以执行的类对象,加载器如下图所示:
3.1 Bootstrap Class Loader
主要负责加载JDK核心类库,例如:java.util.*、java.lang.String等。 我们可以使用getClassLoader读取String的类加载器,但是因为该类不能被调,所有会返回null。
3.2 Extension Class Loader
负责加载JDK下../lib/ext目录下的扩展类库。
3.3 App Class Loader
负责加载应用程序的类,例如我们自己写的Java代码就是它加载的。
4.执行代码块和main()
我们都知道java中有许多执行顺序,在类加载的时候执行代码块和调用main()方法。
5.程序运行
程序开始会调用方法、分配对象空间等操作,JVM使用解释器解释并执行.class文件的字节码指令,然后JIT对频繁调用的热点代码,编译存储在本地,加快程序运行。
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.程序终结
所有线程结束,操作系统资源被释放,程序终结。
总结
写的有些不足之处,还请多多见谅。写文章是我最近开始为准备八股文开始的,一种自我回顾和巩固的过程,内容页都是以前学习的时候一零零散散的笔记整理和自己补充。