好程序员Java分享JVM结构,jvm的基本结构,也就是我们俗称概述。内容很多,而且概念量也很大,关于概念方面,让概念在你的脑子里变成图形,所以只要你有耐心、仔细,发挥自己的想象力,会让你充满信心。当然,不是说看完,就对jvm了解啦,jvm学习的知识非常的多。在你看完,后续我们还会来学jvm的细节,但是如果你在看完的前提下去学习,再学习其他jvm的细节会事半功倍。
1、什么是java虚拟机
首先我们先写一个类
然后打开cmd窗口输入:java test.JVMForJava,打开任务管理器-进程,你看到一个叫java.exe的程序没有,是的这就是java的虚拟机,java xxx这个命令就是用来启动一个java虚拟机,而main函数就是一个java应用的入口,main函数被执行时,java虚拟机就启动了。好了ctrl+c结束你的jvm。在打开你的ecplise,右键run application,再run application一次,再次打开任务管理器-进程,好了,我们看见会有两个javaw.exe,为什么会有两个?因为我们刚才运行了两次run application。这里我是要告诉你,一个java的application对应了一个java.exe/javaw.exe(java.exe和javaw.exe你可以把它看成java的虚拟机,一个有窗口界面一个没有)。你运行几个application就有几个java.exe/javaw.exe。或者更加具体的说,你运行了几个main函数就启动了几个java应用,同时也就启动了几个java的虚拟机。
什么是java虚拟机和虚拟机实例?java的虚拟机相当于我们的一个java类,而java虚拟机实例,相当我们new一个java类,不过java虚拟机不是通过new这个关键字而是通过java.exe或者javaw.exe来启动一个虚拟机实例。
2、jvm的生命周期
(1) 话不多说看代码,然后ecplise里run application 之后在打开任务管理器-进程,你会看到一个javaw.exe的虚拟机在跑,查看控制台输出,并观察任务管理器中的javaw.exe什么时候消失。
(结果我就不截图了,太长了。)
如果你观察控制台和任务管理器的javaw.exe会发现,当main函数的for循环打印完的时候,程序它跟我想的不一样居然没有退出,而等到整个new Thread()里的匿名类的run方法执行结束后,javaw.exe才退出。我们知道在c++的win32编程(CreatThread()),main函数执行完了,寄宿线程也跟着退出了,在c#中如果你用线程池(ThreadPool)的话,结论也是如此,线程都跟着宿主进程的结束而结束。但是在java中貌似和我们的认知有很大的出入,这是怎么回事,先不要看结果自己想想为什么。
没错这就是由于java的虚拟机中它有两种线程,一种叫叫守护线程,一种叫非守护线程,main函数就是个非守护线程,虚拟机的gc就是一个守护线程。java的虚拟机中只要有任何非守护线程还没有结束,java虚拟机的实例都不会退出,所以即使main函数这个非守护线程退出,但是由于在main函数中启动的匿名线程也是非守护线程,它还没有结束,所以jvm没办法退出。
java虚拟机的生命周期,当一个java应用main函数启动时虚拟机也同时被启动,而只有当在虚拟机实例中的所有非守护进程都结束时,java虚拟机实例才结束生命。
原文地址:https://www.cnblogs.com/gcghcxy/p/10955812.html