1.什么是JVM
2.JVM由哪几局部组成
3.程序计数器
4.虚拟机栈
5.本地办法栈
6.堆
7.办法区
8.总结
1.什么是JVM
在咱们日常的JAVA开发过程中,从原来一开始应用的的Servlet,JSP,再到起初呈现的SSM,SpringBoot,以及队列,注册核心等等。这些都是所谓的JAVA下层技术,也是大家都在重点关注和学习的中央。然而大家对于JAVA的技术外围JAVA虚拟机理解甚少。
所以大部分人都认为这些下层技术才是重点,基础知识并不重要,其实这是一种"轻重倒置的心态"。如果咱们把API比喻成数学公式的话,那么JAVA虚拟机的常识就好比公式的推导过程。
所谓虚拟机(JVM)就是指运行JAVA字节码的虚构计算机,就是能将JAVA的字节码文件翻译成操作系统能执行的文件,那么JAVA字节码文件又是哪来的呢?是由JAVAC编译器编译而来的(Javac是一种编译器,它的工作就是将Java源代码语言转化为JVM可能辨认的一种语言),所以整个编译和执行过程如下:
2.JVM由哪几局部组成
咱们先来看一张图:
JVM由类加载子系统,运行时数据区,以及执行引擎和本地办法接口组成,
类先由类装载子系统加载入运行时数据区中,运行时数据区次要保留了JAVA在运行过程中的类,变量,等信息,这也是咱们等等次要要介绍的区域。
然而在字节码装载到JVM当前,字节码并不能运行在操作系统之上,所以这时候咱们须要执行引擎,它将字节码指令解释/编译为对应平台上的本地机器指令。简略来说,JVM中的执行引擎充当了将高级语言翻译为机器语言的译者。
本地办法接口的作用是交融不同的编程语言为java所用,它的初衷是交融C/C++程序。
明天咱们重点来解说运行时数据区的组成以及每一个局部的作用。
3.程序计数器
程序计数器处于线程独占区
程序计数器是一块较小的内存空间,它能够看作是以后线程所执行的字节码的行号指示器。
此区域是惟一一个在java虚拟机标准中没有规定任何OutOfMemoryError状况的区域。
4.虚拟机栈
虚拟机栈处于线程独占区
虚拟机栈形容的是java办法执行的动态内存模型
每当一个新的线程被创立的时候,java虚拟机都会为其调配一个虚拟机栈,java虚拟机栈是以栈帧为单位来保留线程的运行状态。有出栈和入栈两个操作,每当有新办法运行的时候,就会将这个办法入栈,这个办法执行结束后,就会出栈。
5.本地办法栈
本地办法栈处于线程独占区
本地办法栈和虚拟机栈所施展的作用是十分类似的,它们之间的区别不过是虚拟机栈是非虚拟机执行Java办法(也就是字节码)服务,而本地办法栈则是为虚拟机执行Native办法服务的。
在虚拟机标准中对本地办法栈中办法应用的语言、应用形式与数据结构并没有强制规定,因而具体的虚拟机能够自在实现它。
6.堆
堆处于线程共享区
存储对象的实例
垃圾收集器的次要区域
分为,新生代,老生代
存储的全副是对象,每个对象都蕴含一个与之对应的class的信息。
7.办法区
办法区处于线程共享区
存储运行时常量池,已被虚拟机加载的类信息,常量,动态变量,即时编译后的代码等数据
个别垃圾回收不抉择回收这个区域
办法区中蕴含的都是在整个程序中永远惟一的元素,如class,static变量。
8.总结
线程独占区:
程序计数器:
作用:记住下一条代码的执行地址
虚拟机栈:
作用:每个线程都有一个虚拟机栈,有入栈和出栈两个操作。
本地办法栈:
作用:用来执行native办法的栈
线程共享区:
堆:
作用:
保留通过new关键字创立的对象
垃圾收集器的次要区域
办法区:
作用:
存储运行时常量池,已被虚拟机加载的类信息,常量,动态变量,即时编译后的代码等数据