java虚拟机 (JVM)主要组成部分(学习笔记)

写在前面
本篇仅为记录个人学习,如有错误或者不足,欢迎大家指正,感谢各位。

一,类加载器
(1) 加载
引导类加载器
扩展类加载器
应用程序加载器
(2)连接
验证(字节码是否存在)
准备(为静态变量分配内存)
解析(同方法的原始,代替所有内存引用)
(3)初始化
静态变量被分配原始值,并且将执行代码块。

二,运行时数据区
(1) 方法区
主要存储类级别的数据,唯一,共享,非线程安全,值得一提的是运行时常量池,它也是方法区的一部门,其包含的class文件除了类的版本,方法,字段等描述信息以为,还有常量池,用来存放编译生成的字面量等信息,通常是在类加载之后进入运行时常量池中存放。
在这里插入图片描述
(2)堆区
主要存放所有对象及其对应的实际变量和数组,唯一,共享,值得注意的是它也是JVM虚拟机中内存最大的一块,由虚拟机启动时创建,也是被垃圾回收机制管理的主要区域。它通常被分为新生代和老年代,在新生代中又被分为Eden区,ServivorFrom区,以及ServivorTo区。
常见的异常有运行时栈帧过大导致内存溢出,栈帧过多导致内存溢出等。
(3)虚拟机栈
每个线程都会创建单独的运行虚拟机栈,对于每个方法调用,栈内存都会创建一个条目,叫做栈帧,所有局部变量都在栈内存中创建,非共享,是线程安全的。 对应的就是认为的堆栈的栈,它生命周期与线程相同,描述的是Java内存执行的内存模型:每一个方法在执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行完成的过程,对应着一个栈帧在虚拟机栈种入栈到出栈的过程。
(4)程序计数器
每个线程都有自己单独的程序计数器,作用是用在保存当前正在执行的指令。

在这里插入图片描述
(5)本地方法栈
保存本地的方法信息,每个线程都会创建本地方法栈,原理与虚拟机栈大致相同,区别在于本地方法栈是服务于JVM的native方法,而虚拟机栈服务的是JVM的Java方法。

三,执行引擎
(1)简单概述
值得注意的是执行引擎是JVM虚拟机中最核心的部分,简而言之,把执行引擎的主要作用概括为: 输入字节码文件,进行字节码解析,输出执行结果
(2)栈帧
①局部变量表
可以保存为boolean,byte,char,short,float,references和returnAddress
②操作数栈(后进先出)
当一个方法刚开始执行时,其操作数栈是空的,随着方法执行和字节码指令的执行,会从局部变量表和实例的字段中复制常亮,写入到操作栈中,再随着方法的进行,将栈中元素出栈到局部变量表或者返回给方法调用者,也就是出栈和入栈的操作(相当于线程的实际操作台)
③动态链接
运行时常量池的引用
④方法返回地址
方法调用的返回,包括正常时返回(有返回值)和异常返回(无返回值),不同返回类型有不同的指令,但是无论以何种方法退出,在方法退出后都需要返回方法到被调用的位置,程序才能持续执行,方法保存时,可能需要在当前堆栈中保存一些信息,用来帮助恢复上层方法执行时的状态
(3)解释器
主要作用是,读取字节码,执行解释并执行;
(4)JIT解释器
JIT编译器:(中间代码,代码优化,目标代码)
值得一提的是在有些时候需要重复解释一些代码,这样就造成了一些性能上的浪费,于是JIT解释器很好的解决了这一问题: 当它发现重复代码时,就会变异整个字节码,并将其更改为本地代码,本地代码将直接用于方法调用,从而提高性能

原创文章 5 获赞 2 访问量 105

猜你喜欢

转载自blog.csdn.net/weixin_45302751/article/details/106162625