00:00
行,那接下来呢,我们来谈一谈叫GM的一个生命周期,那我们在开发的过程当中呢,其实很多的结构我们都讲过它的生命周期,那那这儿呢,我们也来谈基谈一谈的一个GM的一个生命周期,那这呢,我们主要讲它的三个状态啊,第一个呢,就叫做启动,然后呢叫执行,呃,以及呢,它的一个退出,这也是我们谈一个结构的生命周期,最起码应该具备的三个状态啊,它的开始,呃,运行和结束啊,就跟我们说一个人一样,这个哲学里边说解决哲学里边谈的最基本的问题就是,哎,我是谁对吧?哎,我是谁,我从哪里来,我到哪里去是这样问题哈,其实呢,呃,我觉得这个先说我是谁不太合适哈,其实应该是先说我,我从哪里来,我是谁,然后我将到哪里去?嗯,主要是因为你,你是谁呢?其实这个问题的解决也得依赖于你是从哪来的,对吧?那我们对应这块呢,生命周期就有这样三个状态,其他的一些结构呢,可能它的状态会更多一些,呃,我们就呃不去这个衍生的举例子了,那我们现在呢,首先看一下虚拟机的一个启动,这里边写的非常明确,说Java虚拟机的启动呢,是通过引导类加载器,我们叫boottrap class loader,它创建了一个起始类来完成的,那这个类呢,由虚拟机的具体实现来指定。
01:24
哎,这句话呢,就是来自于我们障碍虚拟机的官方规范,也就是说规范里边只说明了说虚拟机的启动呢,是由于我们引导类加载器加载一个初始,加载了一个初始类,那具体这个类是叫什么名字,诶规范里边没有说,因为呢,这需要看你具体的规范落地的具体的虚拟机是哪一家的哪一个产品来决定这个类到底是什么,诶所以呢,我们在规范里边,呃,就没办法指明具体这个类名了啊。好,那大家看到前面这段话的时候呢,可能会有点懵啊,嗯,那最起码大家应该有这样一个常识,就是我们写的Java程序,就以咱们之前举的这个例子呃来说哈,我们点右键呢去做一个执行,那很显然呢,要想执行这个main方法,那这个main方法首先它所在的类啊,这个类呢就需要加载到内存当中,那这个类的加载首先说这是我们一个自定义的类,那自定义类的加载呢,是通过叫诶系统类加载器,或者我们也叫做应用类加载器来实现的,这个咱们后边会讲啊,这个类的加载器分成引导类加载器,扩展类加载器,那以及呢叫诶系统类加载器,当然下边还有这个用户自定义的啊,咱们先不提这么细了,那咱们现在写的自定义的类呢,就是通过这个叫系统类加载器加载的,但是这个这个类呢,我们明确没有明确的指明它的副类,对吧,那它的副类呢,就是object,而object呢,作为我们核心的API,呃,那object呢是。
02:55
就要被我们引导类加载器所加载的啊,那有同学可能会想说,那这里边说的这个初始类是不是我们说的object类呢?那明确的说呢,其实不是啊,就是我们在执行这样一个简单的程序的时候呢,实际上它会加载非常多的类啊,这个之前呢,呃,我已经看过了,这就先不带大家来看了啊,它会加载非常多的类,那我们这个呢,只是说我们核心的API之一啊,它也只不过是通过也是引导类加载器加载的而已啊。
03:23
也就是说我们需要加载很多的类,那最初的这个类就是由引导类加载器加载的,那这个我们说白了哈,就是我们现在程序要要执行了,我现在要执行的话呢,发现,诶这最起码你这个类的父类呢,还没有加载,我们说父类的加载是要早于这个子类的哈,那父类还没有加载,那包括傅雷在其他的一些结构还得需要加载,那我们必须要用了,OK,这个时候我们才把Java虚拟机给启动起来了。啊,那举个例子啊,就比如说大家你现在想吃苹果啊,你想吃苹果,呃,就好比是我们现在的这个类一样啊,你想加点这类,但是一看,呃,苹果树都没有,OK,那我们先去种苹果树啊,那这个苹果树呢,就好比是我们的虚拟机,你现在呢,想让这个程序去执行,结果呢,它的一些类结构,包括副类结构,还有其他一些必要的一些类呢,都没有,那我们就得先把Java虚拟机给启动起来。
04:22
哎,就是我们说的这样的一个过程啊,那启动起来这个初始类以后呢,接下来会呃,调用这个初始类,它内部有一个main方法啊,就是我们所说的这种main方法啊,哎,这个main方法当中,它再去使用其他的一些类来相继的,我们就把后续的类就都给它加载进来了,这样呢,就是我们所说的,诶虚拟机的启动。啊,其实呃,剖析了一下呢,应该说就简单很多了啊,那咱们后边呢,在讲了类的加载以后,大家回过来再来看这段话呢,就更清晰好,那下边呢,就叫做虚拟机的执行,这呢其实才是我们最关心的部分,对吧?说一个运行中的Java虚拟机有一个清晰的任务呢,就是执行Java程序。
05:06
啊,就是执行Java程序,然后这个程序开始执行的时候,它在运行啊,这个程序结束的时候呢,它就停止了,呃,这其实也间接的就提到了我们虚拟机什么时候执行结束哈,就是我们在程序结束的时候,它就结束了,那执行一个所谓的Java程序的时候,真真正正在执行的是一个叫做Java虚拟机的进程,诶我们其实是在执行一个进程,比如说我们当年这个程序,我把它运营起来,其实它执行的就是一个进程了。哎,当然现在我们想看这个进程的话呢,这个程序因为比较短,很快就执行完了,诶我这样做一个操作啊,我写一个线程。哎,让我们当前这个程序呢,执行的稍微的诶慢一点,我写上,比如说6000毫秒。诶把这异常呢,我们先给大家抛一下,在这个后面我写一个hello。
06:03
好,这个程序呢,我们就学完了,学完以后呢,现在我们把它跑起来。行跑起来了,那陈达现在还没有结束啊,我在这个位置呢,我写一个叫呃GPS,这个GPS呢,就是打印咱们当前这个程序当中的执行中的进程啊,那在这个进程当中,大家会看到我们这儿有一个当前咱们执行的这个程序的一个进程,它是13264诶这样的一个端口号啊,那我们再看这个run,诶,Hello出来了,出来以后呢,我们回过来再去执行一下刚才这个呃,GPS。此时的话,你会发现当前这个进程已经没有了,因为程序程序执行结束,那么咱们此时的这个GVM呢,其实它也就正常的,诶退出了。哎,是这样子的啊,那我们如果这个在服务器中,我们部署了三个外部应用,那其实我们可以让三个外部应用呢,诶使用三个虚拟机呢去执行,哎可以是这样子的啊好,这呢是我们说的这个叫诶虚拟机的一个执行。
07:07
那下边呢,我们来看一下,这个叫虚拟的退出,呃退出呢其实就很好理解,刚才其实也提到了,当程序正常执行结束的时候就退出了,再一个呢,就是在执行过程当中出现异常了,或者是错误呢,或者是错误,而我们没有处理这些异常,那就会导致呢,呃异常终止,呃这个也很好理解啊,嗯,然后下边呢,由于操作系统出现错误导致的,诶虚拟机进程终止,哎,这个也很好理解,虚拟机的问呃这个操作系统的问题,然后下面呢,提到了说呃线程就是上边呢,算是我们在程序中这个一个正常的,或者一些呃异常没处理的情况导致的,然后我们也可以在代码中主动的去结束程序的执行,这里边呢,就提到了像system里边的ex方法,那这个大家有可能在写代码过程中用过啊,那一般呢,咱们不会主动的去这个结束了啊,这个system有个预测方法,包括runtime也有,还有time里边一个,呃,Hunt这个方法,那我们可以看一下这个源码。
08:07
哎,首先呢,我们看一下这个system,诶system里边呢,诶这里边就提到它有一个这个,诶ex的这个方法,那这个方法呢,我们可以填一个非零的一个数值,诶这个大家会看到这个词,诶这样吧,咱们先来看一下这个叫runtime啊。呃,因为我们刚才看到这个system里呢,它调了这个runtime啊,那在这个runtime里边呢,我们看到它有一个ex这个方法,那这个方法然后呢,调用一下我们这个叫诶shutdown ex,然后点击啊ex进来,然后呢下边呢去做了一个执行,当我们这个status不等于零的时候呢,就调了我们这个方法。那这个方法呢,掉了一个hunt。零啊这呢是一个native本地的方法,我们就看不到里边了,这呢是用来结束我们当前程序的执行啊,其实呢,就把整个这个线程,那整个这个进程呢,给我们就断掉了啊,诶这是他的这样一个情况。
09:05
好,那刚才呢,也提到了,我们在runtime里边呢,还可以直接来调用,刚才提到了这个叫诶hunt这个方法,诶这里边你看它也同样的调了这个杀down里边这个hunt方法也是他俩最终目的呢,是殊途同归的啊,只不过调用的这个方法名字诶不太一致啊,那ex我们回过来再看一眼,Ex的话呢,其实它直接又调用了我们runtime,诶注意这个time这个类呢,是一个一个叫运行时就是咱们Java虚拟机,咱们不是一开始带着大家看一下这个图吗?回过来。哎,跑的有点靠。再往下啊。诶,这个图啊,咱不是带着大家看一下这个图嘛,那这个图中间这一部分呢,就是我们所说的叫运行时数据区啊,这呢就可以理解成是我们的运行时环境啊,那这个呃,一个GM我们说这边就对应的一个运行时环境嘛,运行时数据区,那么所以我们这个运行数据区对应的这个类呢,其实就是runtime啊,叫运行时环境,所以这个类呢,它是一个单立的。
10:16
啊,大家看到这是造了一个对象,这是它的一个,呃,这个静态的public的方法来获取这个实例的,这是他的私有的构造器,呃,是一个恶汉式。啊,是一个恶汉式,那我们获取到当前的这个time它的唯一的实例,然后将当前这个进程给他结束掉,诶,Ex又回到咱们刚才看的runtime这块了,诶也就是说呢,我们可以在代码中呢,主动的将程序给它关闭掉啊把我们这个进程呢给它结束好,这是呢,就是进程一结束,虚拟机当然也就结束了啊。那除此之外呢,这个了解一下,这个GI呢,就是我们说的本地方法接口,呃,它规范了在GI中可以使用相应的API呢,来加载或卸载这个Java虚拟机,这个大家了解一下就可以了,行,那刚才呢,我们就提了一下虚拟机的启动执行和退出,诶里边有些点呢,需要大家清楚。
我来说两句