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 关键字创立的对象
垃圾收集器的次要区域
办法区:
作用:
存储运行时常量池,已被虚拟机加载的类信息,常量,动态变量,即时编译后的代码等数据