节:JVM的生命周期

Posted 李阿昀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了节:JVM的生命周期相关的知识,希望对你有一定的参考价值。

这一讲,我们来谈一谈JVM的生命周期。

JVM的生命周期

大家做了这么久的开发,应该知道很多的结构其实都有其生命周期吧!而关于JVM的生命周期,这里我们则主要讲述它的三个状态,即虚拟机的启动、虚拟机的执行以及虚拟机的退出,这也是一个结构的生命周期最起码应该具备的三个状态——开始、运行、结束。

这就像哲学里面讨论的终极问题一样,我是谁?我从哪里来?我将到哪里去?其实,我觉得先提出我是谁这个问题不太合适,正确的顺序应该是先提出我从哪里来这个问题,然后再提出我是谁这个问题,最后再提出我将到哪里去这个问题,即我从哪里来?我是谁?我将到哪里去?其原因是因为我是谁这个问题的解决需要依赖于我从哪里来这个问题的解答。

对应于JVM的生命周期,那就有虚拟机的启动、虚拟机的执行以及虚拟机的退出这样三个状态了,当然,其他的一些结构可能状态会更多一些,但这不是我们要考虑的问题,所以这里我也就不给大家去举一些衍生的例子了。

虚拟机的启动

Java虚拟机的启动是通过引导类加载器(英文叫bootstrap class loader)创建一个初始类(initial class)来完成的,这个类是由虚拟机的具体实现来指定的。

以上这句话其实出自Java虚拟机的官方规范,规范里面就说明了Java虚拟机的启动是通过引导类加载器创建一个初始类来完成的。

有童鞋可能就要问了,规范里面有说明创建的这个初始类的名字是什么吗?哈哈哈😁,规范里面并没有明确说明,当然,也是压根没办法去指明这个具体的类名,究其原因就是因为这个类得需要由虚拟机的具体实现来指定。

当然,有些童鞋看到上面那句话可能会有点懵,但是大家最起码应该要有这样一个常识,就是我们编写的Java程序,就以下面这个Java程序来说,如果我们想要去做一个执行,实际上就是去执行其中的main方法,那么这个main方法所在的类首先就得被加载到内存当中。而且,由于这个main方法所在的类是我们自定义的一个类,所以它是通过系统类加载器(当然,你也可以叫做应用类加载器)来完成加载的。

package com.meimeixia.java;

/**
 * @author liayun
 * @create 2022-08-19 10:43
 */
public class StackStruTest 
    public static void main(String[] args) 
        // int i = 2 + 3;
        int i = 2;
        int j = 3;
        int k = i + j;
    

这里,我提前给大家讲到了一个系统类加载器,看到这,大家可能又有点懵了,这都是很正常的现象,没有人天生就懂这些东西,不懂一点都不羞耻,不过要是在我谆谆教导下还不懂那就真的有点说不过去了,大家得好好努力才行啊!

关于类的加载,这里我只想告知大家两点。

  • 第一点:类的加载器可分成引导类加载器、扩展类加载器、系统类加载器以及用户自定义的加载器这几种。
  • 第二点:自定义类的加载是通过系统类加载器来实现的。

至于更加详细的内容,那就只有等到后面我再来给大家进行讲解了,这里大家先知道以上两点即可。

不知道大家发现没有,以上自定义类并没有明确指明它的父类,那么问题来了,它的父类到底是谁呢?想都不用想,它的父类就是Object,这点傻子都知道。但是,有一点大家可能不是很清楚,就是Object作为核心的API之一,它是需要被引导类加载器所加载的。

由此,大家可能会联想,都说Java虚拟机的启动是通过引导类加载器创建一个初始类来完成的,那么这个初始类有没有可能是Object呢?我就明确说了,不是,大家知道这点即可。

此外,我还想告知大家一点,就是我们在执行以上那个简单的Java程序的时候,实际上会加载非常多的类,关于这点我也去验证了一下,当然,这里我就不带着大家一起去看了。既然是会加载非常多的类,那自然而然就会包括Object类了,而它正是通过引导类加载器来加载的。

其实说白了,如果大家现在想要执行编写的Java程序的话,那么最起码main方法所在类的父类必须得先被加载,这是因为父类的加载要早于子类。而你现在就想着急忙慌地去执行程序,结果却发现它里面的一些类结构(例如父类和其他一些必要的类等)都还没加载,那么这个时候我们就不得不先把Java虚拟机给启动起来了。

举个例子,你现在想吃苹果,这就好比是你想加载一个类一样,结果却发现连苹果树都没有,那你是不是得先去种苹果树啊!很显然,这个苹果树就好比是Java虚拟机了。

Java虚拟机通过引导类加载器创建一个初始类来完成启动之后,接着便会来调用这个初始类中的main方法,这是因为该初始类内部就有一个main方法。在这个main方法当中,。。。

以上是关于节:JVM的生命周期的主要内容,如果未能解决你的问题,请参考以下文章

节:JVM的生命周期

JVM生命周期

JVM运行时内存区域结构

节:如何看待Java上层技术与JVM?

节:如何看待Java上层技术与JVM?

JVM类生命周期概述:加载时机与加载过程