文档章节

JVM体系结构详解

liululee
 liululee
发布于 2019/09/04 22:37
字数 1513
阅读 65
收藏 0

每个Java开发人员都知道字节码将由JRE (Java运行时环境)执行。但是很多人不知道JRE是Java Virtual Machine(JVM)的实现,它分析字节码、解释代码并执行代码。作为开发者,了解JVM的体系结构非常重要,因为它使我们能够更有效地编写代码。在本文中,我们将更深入地了解Java中的JVM体系结构和JVM的不同组件。

什么是JVM呢?

虚拟机是物理机的软件实现。Java是用WORA(编写一次运行到任何地方)的概念开发的,它在VM上运行。编译器将Java文件编译成Java .class文件,然后将.class文件输入JVM, JVM加载并执行类文件。下面是JVM的架构图。

file

JVM是如何工作的?

如图所示,JVM分为三个主要子系统:

  1. 类加载器子系统
  2. 运行时数据区
  3. 执行引擎

1. 类加载器子系统

Java的动态类加载功能由类加载器子系统处理。它装载的链接。在运行时而不是编译时首次引用类时初始化类文件。

1.1 加载

类将由该组件加载。引导类加载器、扩展类加载器和应用程序类加载器是有助于实现这一目标的三个类加载器。

  1. 引导类加载器 – 负责从引导类路径加载类,除了rt.jar什么也没有。这个加载程序将获得最高优先级。
  2. 扩展类加载器 – 负责加载ext文件夹**(jre\lib)**中的类。
  3. 应用程序类加载器 –负责加载应用程序级类路径、所述环境变量的路径等。

上述类加载器在加载类文件时将遵循委托层次结构算法。

1.2 链接

  1. 验证 – 字节码验证器将验证生成的字节码是否正确,如果验证失败,我们将得到验证错误。
  2. 准备 – 内存将为所有静态变量分配默认值。
  3. 解析 – 所有符号内存引用将被来自方法区域的原始引用所替换。

1.3 初始化

这是类加载的最后阶段;在这里,所有静态变量都将被赋初始值,并且静态块也会被执行。

2. 运行时数据区

运行时数据区被分为五个主要组件:

  1. 方法区 – 所有类级数据都将存储在这里,包括静态变量。每个JVM只有一个方法区,它是资源共享的。

  2. –所有对象及其对应的实例变量和数组都将存储在这里。每个JVM也仅有一个堆。由于方法区和堆被多个线程共享内存,因此存储的数据不是线程安全的。

  3. –每个线程将创建一个单独的运行时栈。每个方法调用都会在栈内存中生成一个条目,称为栈帧。所有本地变量都将在栈内存中创建。栈区域是线程安全的,因为它不是内存共享的。

    栈区域被分为三个部分:

    1. 局部变量数组 – 与方法相关,涉及到局部变量以及相应的值都将存储在这里。
    2. 操作数堆栈 –如果需要执行任何中间操作,操作数堆栈充当运行时工作区来执行操作。
    3. 帧数据 – 所有与方法对应的符号都存储在这里。在任何异常情况下,catch块信息都将保存在帧数据中。
  4. PC寄存器 – 每个线程将有单独的PC寄存器,以保持当前执行指令的地址一旦指令执行,PC寄存器能顺利地更新到下一条指令。

  5. 本地方法栈 – 本机方法栈保存着本地方法信息。对于每个线程,都将创建一个单独的本机方法栈。

3. 执行引擎

被分配给运行时数据区的字节码将由执行引擎执行。执行引擎读取字节码并逐个执行。

  1. 解释器 – 解释器更快地解释字节码,但执行速度很慢。解释器的缺点是,当一个方法被多次调用时,每次都需要一个新的解释。

  2. JIT编译器

    – JIT编译器消除了解释器的缺点。执行引擎将在转换字节码时使用解释器的帮助,但是当它发现重复的代码时,它使用JIT编译器,JIT编译整个字节码并将其更改为本机代码。此本机代码将直接用于重复的方法调用,从而提高系统的性能。

    1. 中间代码生成器 – 生成中间代码
    2. 代码优化器 – 负责优化上面生成的中间代码
    3. 目标代码生成器 – 负责生成机器代码或本地代码
    4. 分析器 – 一个特殊的组件,负责寻找热点,即方法是否被多次调用。
  3. 垃圾收集器:收集和删除未引用的对象。可以通过调用 System.gc()触发垃圾收集,但不能保证执行。JVM的垃圾收集收集创建的对象。

Java本地接口(JNI): JNI将与本地方法库交互,并提供执行引擎所需的本地库。

本机方法库: 这是执行引擎所需的本机库的集合。

最初发表于2016年9月

进一步的阅读

Java Memory Management

A Detailed Breakdown of the JVM

The Evolution of the Java Memory Architecture

送福利啦~ 近期将之前已翻译文章,整理成了PDF。 ​ 在公众号后台回复:002即可领取哦~ ​ 后续也会不断更新PDF的内容,敬请期待!

img

© 著作权归作者所有

liululee
粉丝 130
博文 80
码字总数 117498
作品 0
杭州
程序员
私信 提问
Java程序员从笨鸟到菜鸟全部博客目录【2012年十一月七日更新】

本文来自:曹胜欢博客专栏。转载请注明出处:http://blog.csdn.net/csh624366188 大学上了一年半,接触java也一年半了,虽然中间也有其他东西的学习,但是还是以java为主路线,想想这一年半,...

长平狐
2012/11/12
256
0
《数据结构与算法系列》合集整理

《数据结构与算法系列》合集整理 整理来自博客园skywang12345,以下摘自作者介绍: “最近抽空整理了"数据结构和算法"的相关文章。在整理过程中,对于每种数据结构和算法分别给出"C"、"C++"...

kaixin_code
2018/12/01
266
0
《Java程序员由笨鸟到菜鸟》电子版书正式发布,欢迎大家下载

在众多朋友的支持和鼓励下,《Java程序员由菜鸟到笨鸟》电子版终于和大家见面了。本电子书涵盖了从java基础到javaweb开放框架的大部分内容。在编写的过程中,难免会出现一些错误,希望大家能...

长平狐
2012/11/12
310
0
《Java程序员由笨鸟到菜鸟》电子版书正式发布,欢迎大家下载

在众多朋友的支持和鼓励下,《Java程序员由菜鸟到笨鸟》电子版终于和大家见面了。本电子书涵盖了从java基础到javaweb开放框架的大部分内容。在编写的过程中,难免会出现一些错误,希望大家能...

长平狐
2012/11/12
178
0
【Java并发专题】27篇文章详细总结Java并发基础知识

努力的意义,就是,在以后的日子里,放眼望去全是自己喜欢的人和事! github:https://github.com/CL0610/Java-concurrency,欢迎题issue和Pull request。所有的文档都是自己亲自码的,如果觉...

你听___
2018/05/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Android MVP 快速开发框架ZBLibrary

MVP 架构,提供一套开发标准(View,Data,Event)以及模板和工具类并规范代码。封装层级少,简单高效兼容性好。 OKHttp、UIL图片加载、ZXing二维码、沉浸状态栏、下载安装、自动缓存以及各种B...

boonya
26分钟前
33
0
printf的格式很长的论点是什么?

printf函数采用参数类型,例如%d或%i用于signed int 。 但是,我没有看到任何long价值的东西。 #1楼 如果您打算像我一样打印unsigned long long ,请使用: unsigned long long n;printf("...

技术盛宴
32分钟前
46
0
为BlueLake主题增加图片放大效果

fancyBox 是一个流行的媒体展示增强组件,可以方便为网站添加图片放大、相册浏览、视频弹出层播放等效果。优点有使用简单,支持高度自定义,兼顾触屏、响应式移动端特性,总之使用体验相当好...

CREATE_17
32分钟前
23
0
如何将现有的Git存储库导入另一个?

我在名为XXX的文件夹中有一个Git存储库,还有第二个名为YYY的 Git存储库。 我想将XXX存储库作为名为ZZZ的子目录导入YYY存储库,并将所有XXX的更改历史记录添加到YYY 。 之前的文件夹结构: ...

javail
47分钟前
22
0
JSP-Servlet入门2之JSP运行原理(一)

JSP全名为Java Server Pages,中文名叫java服务器页面,是一种动态页面技术 。实际上JSP是指在HTML中嵌入java脚本语言, 一、 JSP起源 在很多动态网页中,绝大部分内容都是固定不变的,只有局...

橘子_
今天
28
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部