码迷,mamicode.com
首页 > 编程语言 > 详细

好程序员Java分享JVM结构

时间:2019-05-31 16:31:22      阅读:129      评论:0      收藏:0      [点我收藏+]

标签:控制台   而且   run方法   概述   两种   是的   关于   截图   右键   

  好程序员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虚拟机实例才结束生命。

好程序员Java分享JVM结构

标签:控制台   而且   run方法   概述   两种   是的   关于   截图   右键   

原文地址:https://www.cnblogs.com/gcghcxy/p/10955812.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!