JVM 架构解读
每个Java开发人员都知道字节码由JRE(Java运行时环境)执行。但许多人不知道JRE是Java Virtual Machine(JVM)的实现,它分析字节码,解释代码并执行它。作为开发人员,我们应该知道JVM的架构是非常重要的,因为它使我们能够更有效地编写代码。在本文中,我们将更深入地了解Java中的JVM架构和JVM的不同组件。
什么是JVM?
Virtual Machine是物理机器的软件实现。Java是用在VM上运行的WORA(Write Once Run Anywhere)概念而开发的。编译器将Java文件编译为Java .class文件,然后将.class文件输入到JVM中,JVM会加载并执行类文件。下面是JVM的架构图。
JVM如何工作?
如上面的架构图所示,JVM分为三个主要子系统:
- 类加载器子系统
- 运行时数据区
- 执行引擎
1.类加载器子系统
Java的动态类加载功能由类加载器子系统处理。它在运行时,而不是编译时首次引用类的时候加载、链接、并初始化类文件。
1.1加载
类将通过此组件加载。Boot Strap Class Loader,Extension Class Loader和Application Class Loader是有助于实现的三个类加载器。
- Boot Strap Class Loader——负责加载来自于 Bootstrap 类路径的类,就是rt.jar。此加载程序将给予最高优先级。
- Extension Class Loader——负责加载在ext文件夹(jre \ lib)内的类。
- Application Class Loader——负责加载应用程序级类路径,路径提到环境变量等
上面的类记载器在加载类文件时遵循Delegation Hierarchy 算法。
1.2链接
- 验证——字节码验证器将验证生成的字节码是否正确,如果验证失败,我们将得到verification error。
- 准备——对于所有的静态变量,内存将被分配和配置默认值。
- 解决——所有的符号存储器引用都将替换为来自Method Area的原始引用。
1.3初始化
这是类加载的最后阶段,这里所有的静态变量都将被赋予原始值,并执行静态块。
2.运行时数据区
运行时数据区分为5个主要组件:
方法区——所有的类级别数据将存储在这里,包括静态变量。每个JVM只有一个方法区,并且它是一个共享资源。
堆区域——所有对象及其对应的实例变量和数组将存储在这里。每个JVM也有一个堆区域。由于方法和堆区域共享多个线程的内存,因此所存储的数据非线程安全。
堆栈区——对于每个线程,将创建一个单独的运行时栈。对于每个方法调用,将在堆栈存储器中产生一个条目,称为堆栈帧。所有局部变量将在堆栈内存中创建。堆栈区域是线程安全的,因为它不是共享资源。堆栈帧分为三个子元素:
- 局部变量数组——与方法相关,涉及局部变量以及将在此存储的相应值的多少。
- 操作数堆栈——如果需要执行任何中间操作,那么操作数堆栈将充当运行时工作空间来执行操作。
- 帧数据——对应于方法的所有符号存储在此处。在任何异常的情况下,捕捉块信息将被保持在帧数据中。
PC寄存器——每个线程都有单独的PC寄存器,用于保存当前执行指令的地址,一旦指令执行,PC寄存器将更新到下一条指令。
本地方法堆栈——本地方法堆栈保存本地方法信息。对于每个线程,将创建一个单独的本地方法堆栈。
3.执行引擎
分配给运行时数据区的字节码将由执行引擎执行。执行引擎读取字节码并逐个执行它。
解释器——解释器解释字节码较快,但执行慢。解释器的缺点是当一个方法被多次调用时,每次都需要新的解析。
JIT编译器——JIT编译器消除了解释器的缺点。执行引擎将在转换字节码时使用解释器的帮助,但是当它发现重复的代码时,它使用JIT编译器,编译器会编译整个字节码并将其更改为本地代码。这个本地代码将直接用于重复的方法调用,从而提高系统性能。
- 中间代码生成器——生成中间代码
- 代码优化器——负责优化上面生成的中间代码
- 目标代码生成器——负责生成机器代码或本地代码
- 分析器——一个特殊组件,负责查找热点,即该方法是否被多次调用。
垃圾收集器:收集和删除未引用的对象。可以通过调用“System.gc()”触发垃圾收集器,但不能保证执行。JVM的垃圾回收收集创建的对象。
Java本机接口(JNI):JNI将与本地方法库进行交互,并提供执行引擎所需的本地库。
本地方法库:它是执行引擎所需的本地库的集合。
学习Java的同学注意了!!!
学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:454297367 我们一起学Java!
JVM 架构解读的更多相关文章
- 【转】JVM 架构解读
每个Java开发人员都知道字节码由JRE(Java运行时环境)执行.但许多人不知道JRE是Java Virtual Machine(JVM)的实现,它分析字节码,解释代码并执行它.作为开发人员,我们应 ...
- java面试题之----JVM架构和GC垃圾回收机制详解
JVM架构和GC垃圾回收机制详解 jvm,jre,jdk三者之间的关系 JRE (Java Run Environment):JRE包含了java底层的类库,该类库是由c/c++编写实现的 JDK ( ...
- JVM架构和GC垃圾回收机制详解
JVM架构图分析 下图:参考网络+书籍,如有侵权请见谅 (想了解Hadoop内存溢出请看:Hadoop内存溢出(OOM)分类.参数调优化) JVM被分为三个主要的子系统 (1)类加载器子系统(2)运行 ...
- RESTful API 架构解读
RESTful API 架构解读 首先我们还是先介绍下 RESTful api 的来龙去脉. 首先, RESTful (下文都简称 RESTful api 为 RESTful ) 1.RESTful ...
- [转]一图读懂JVM架构解析
每个Java开发人员都知道字节码经由JRE(Java运行时环境)执行.但他们或许不知道JRE其实是由Java虚拟机(JVM)实现,JVM分析字节码,解释并执行它.作为开发人员,了解JVM的架构是非常重 ...
- JVM架构和GC垃圾回收机制
深入理解系列之JDK8下JVM虚拟机(1)——JVM内存组成 https://blog.csdn.net/u011552404/article/details/80306316 JVM架构和GC垃圾回 ...
- JVM系列之一:JVM架构
1.简介 Java平台可分为两部分,即Java虚拟机(Java virtual machine,JVM)和Java API类库. JVM是Java Virtual Machine(Java虚拟机)的缩 ...
- Java虚拟机系列一:一文搞懂 JVM 架构和运行时数据区
前言 之前写博客一直比较随性,主题也很随意,就是想到什么写什么,对什么感兴趣就写什么.虽然写起来无拘无束,自在随意,但也带来了一些问题,每次写完一篇后就要去纠结下一篇到底写什么,看来选择太多也不是好事 ...
- Java8 JVM参数解读
附录:https://www.liangzl.com/get-article-detail-134315.html 摘要: 我们知道java虚拟机启动时会带有很多的启动参数,Java命令本身就是一个多 ...
随机推荐
- javascript设计模式:策略模式
前言 策略模式有效利用组合.委托.多态等技术和思想,可以有效避免多重条件选择语句. 策略模式对开放-封闭原则提供了很好的支持,将算法封装在strategy中,使得他们易于切换.理解.扩展. 策略模式中 ...
- 【夯实Mysql基础】MySQL性能优化的21个最佳实践 和 mysql使用索引
本文地址 分享提纲: 1.为查询缓存优化你的查询 2. EXPLAIN 你的 SELECT 查询 3. 当只要一行数据时使用 LIMIT 1 4. 为搜索字段建索引 5. 在Join表的时候使用相当类 ...
- Android Weekly Notes Issue #234
Android Weekly Issue #234 December 4th, 2016 Android Weekly Issue #234 本期内容包括: ConstraintLayout的使用; ...
- 如何搭建git服务器
一.前言 现在越来越多的公司用git进行版本控制,不过git是默认是开源的,如果私有的话是需要付费的,如果不想付费自己可以搭建一个git服务器用来版本控制. 二.服务器端操作 1.安装git sudo ...
- linux练习题
观察系统当前进程的运行情况的命令是( ):A.freeB.dmesgC.topD.last 答案:http://hovertree.com/tiku/bjag/foxg5n0q.htm Linux系统 ...
- 怎样在Dos里切换盘符
一:在Dos里切换盘符 a:在电脑左下角右击显示图片;(我用的是win10系统,其他系统类似) b:点击运行,输入cmd; c:点击确定: d:输入盘符:(如f:) 或F: 只写字母,不写分号是不行的 ...
- 前端开发小白必学技能—非关系数据库又像关系数据库的MongoDB快速入门命令(2)
今天给大家道个歉,没有及时更新MongoDB快速入门的下篇,最近有点小忙,在此向博友们致歉.下面我将简单地说一下mongdb的一些基本命令以及我们日常开发过程中的一些问题.mongodb可以为我们提供 ...
- innodb 自增列重复值问题
1 innodb 自增列出现重复值的问题 先从问题入手,重现下这个bug use test; drop table t1; create table t1(id int auto_increment, ...
- Mono 3.2.3 TCP吞吐性能测试报告
在前几天简单地测试了一下Mono 3.2.3 TCP处理的稳定性,有同学问Mono 3.2.3的TCP处理性有怎样,以下是针对Mono 3.2.3TCP在吞吐方面的性能测试.主要测试分两种场分别是连接 ...
- 延迟求值-如何让Lo-Dash再提速x100?
「注释」作者在本文里没有说明这么一个事实: 目前的版本Lo-Dash v2.4.1并没有引入延迟求值的特性,Lo-Dash 3.0.0-pre中部分方法进行了引入,比如filter(),map(),r ...