jvm: java 虚拟机,一个main方法运行就有一个对应的虚拟机;
生命周期就是一个程序的开始到一个程序的结束。
java.exe这个程序其实就是一个java虚拟机
一个java的application对应了一个java.exe/javaw.exe你
直白点说就是你运行了几个main函数就启动了几个java应用,也就对应启动了几个java虚拟机
重点:java虚拟机有两种线程,一种叫守护线程,一种叫非守护线程。
守护线程:GC(可以理解为生活中的智能机器人)垃圾回收机制,这个后续讲解
非守护线程:main()函数主线程,函数中new Thread()匿名线程都是非守护线程
关键点:java虚拟机中,只要有任何非守护线程还没有结束,java虚拟机实例都不会退出。
Java虚拟机的体系结构:
首先 java虚拟机是不能直接读懂Java代码的,是读取编译器运行生成的class文件的
class文件 ---------------------》 类装载器,子系统
| |
| |
方法区 堆 java栈 PC寄存器 本地方法栈 (运行数据区)
| | |
| | |
执行引擎 《 ----------------》本地方法接口 《-------------------本地方法库
详细了解可以看这个博客,个人觉得很不错,引用一下https://www.cnblogs.com/xuningchuanblogs/p/7688332.html
总结:
首先,当一个程序启动之前,它的class会被类装载器装入方法区(不好听,其实这个区我喜欢叫做Permanent区),执行引擎读取方法区的字节码自适应解析,边解析就边运行(其中一种方式),然后pc寄存器指向了main函数所在位置,虚拟机开始为main函数在java栈中预留一个栈帧(每个方法都对应一个栈帧),然后开始跑main函数,main函数里的代码被执行引擎映射成本地操作系统里相应的实现,然后调用本地方法接口,本地方法运行的时候,操纵系统会为本地方法分配本地方法栈,用来储存一些临时变量,然后运行本地方法,调用操作系统APIi等等。