好程序员Java分享JVM结构

  好程序员Java分享JVM结构,jvm的基本结构,也就是咱们俗称概述。内容不少,并且概念量也很大,关于概念方面,让概念在你的脑子里变成图形,因此只要你有耐心、仔细,发挥本身的想象力,会让你充满信心。固然,不是说看完,就对jvm了解啦,jvm学习的知识很是的多。在你看完,后续咱们还会来学jvm的细节,可是若是你在看完的前提下去学习,再学习其余jvm的细节会事半功倍。
一、什么是java虚拟机
  首先咱们先写一个类
图片描述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来启动一个虚拟机实例。
二、jvm的生命周期
(1)话很少说看代码,而后ecplise里run application 以后在打开任务管理器-进程,你会看到一个javaw.exe的虚拟机在跑,查看控制台输出,并观察任务管理器中的javaw.exe何时消失。
图片描述c++

  (结果我就不截图了,太长了。)
  若是你观察控制台和任务管理器的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虚拟机实例才结束生命。程序员

相关文章
相关标签/搜索