JAVA虚拟机(JVM)—学习总结
首先我们编写的.java文件电脑本身是无法解析的,要通过javac先编译成.class文件,然后jvm编译成电脑可以认识的文件。
1. JVM 体系结构
-
JVM 包含两个子系统和两个组件
子系统:Class Loader (类加载) 、Execution engine(执行引擎)
组 件:Runtime data Area(运行时数据区) 、Native Interface(本地接口)- Class Loader (类加载) : 用来装载.class文件
- Execution Engine(执行引擎):执行class中的指令
- 运行时数据区(方法区、堆、java栈、PC寄存器、本地方法栈),也就是JVM内存
- Native Interface(本地接口):与native librarie交互,是与其它编程语言交互的接口
-
JVM 运行过程:javac将.java文件转换成字节码,交由类加载器,类加载器再把字节码加载到运行时数据区(内存中),由于字节码文件只是JVM的一套指令集规范,不能直接交给底层系统去执行,这时候就需要特定的命令解析器–执行引擎将字节码文件翻译成底层系统能够识别的系统指令,再交由CPU去执行的同时还需要调用其他语言的本地库接口,进而实现整个程序的运转。
2. JVM 运行时数据区解析
- 方法区
-
方法区是所有线程共享的内存区域,用于存储已经被JVM加载的类信息、常量、静态变量,即时编译后的代码等数据。 静态的变量放在方法区,静态的对象是放在堆的。
-
它有个别命叫Non-Heap(非堆)。当方法区无法满足内存分配需求时,抛出OutOfMemoryError异常。
- Java 堆
- Java Heap 在虚拟机启动时创建,是JVM内存中最大的一块,是所有线程的共享区域。
- 所有的对象实例以及数组都要在堆上分配。从内存回收角度看,java堆可分为:新生代和老生代。从内存分配角度看,线程共享的Java堆中可能划分出多个线程私有的分配缓冲区。无论怎么划分,都与存放内容无关,无论哪个区域,存储的都是对象实例,进一步的划分都是为了更好的回收内存,或者更快的分配内存。
- java堆是垃圾收集器管理的主要区域,因此也被成为“GC堆”。
- 当前主流的虚拟机都是可扩展的(通过 -Xmx 和 -Xms 控制)。如果堆中没有内存可以完成实例分配,并且堆也无法再扩展时,将会抛出OutOfMemoryError异常。
- Java虚拟机栈
- Java虚拟机栈是线程私有的,它的生命周期和线程相同。
- Java虚拟机栈是服务 Java 方法的。
- Java虚拟机栈是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。
— 局部变量:存储8种数据类型,对象引用地址,return 对象类型
— 操作数栈:操作数据的意义,比如运算一组数据,读取代码进行计算后再放入局部变量中。
— 动态链接:存储链接的地方,比如跳转到另一个方法中就是动态链接。如果一个栈中有动态链接调用别的方法,就会去创建新的栈帧,栈中也是有顺序的,一个栈帧调用另一个栈帧,另一个栈帧就会排在调用者的下面。递归的调用自己也会创建多个栈帧,在栈中从上往下排。
—出口:运行正常就是return,运行异常就是抛出异常。
- 本地方法栈
- 本地方法栈是为虚拟机调用 Native 方法服务的。(Native 方法的源码大部分都是 C和C++ 的代码)
-
程序计数器
定义
-
程序计数器是计算机处理器中的寄存器,用于存放下一条指令所在单元的地址。
-
当执行一条指令时,首先需要根据PC中存放的指令地址,将指令由内存取到指令寄存器中,与此同时,PC中的地址或自动加1或由转移指针给出下一条指令的地址。此后经过分析执行指令。完成第一条指令的执行,而后根据PC取出第二条指令的地址,如此循环,执行每一条指令。当计算机重启或复位时,程序计数器通常恢复到零。
为什么是线程私有? -
Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式实现的(CPU运行遵循调度策略,调度策略是时基于时间片的),也就是说,在同一时刻一个处理器内核只会执行一条线程,处理器切换线程时并不会记录上一个线程执行到哪个位置,所以为了线程切换后依然能恢复到原位,每条线程都需要有各自独立的程序计数器。
-
举个通俗的例子,线程A正在玩游戏,突然,线程B打来了电话,线程B就会抢夺线程A的时间片,打断线程A,线程A就会挂起,然后挂断电话,线程A该干什么,线程A是不知道的,他只负责执行,不具备记忆功能,这时候就要用到程序计数器来记录。
3. 堆和栈的区别
学习文章链接:https://blog.csdn.net/weixin_43122090/article/details/105463446