前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java虚拟机 (JVM)主要组成部分(学习笔记)

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

作者头像
用户7886150
修改2020-12-01 18:00:18
4060
修改2020-12-01 18:00:18
举报
文章被收录于专栏:bit哲学院

参考链接: 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解释器很好的解决了这一问题: 当它发现重复代码时,就会编译整个字节码,并将其更改为本地代码,本地代码将直接用于方法调用,从而提高性能

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档