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

什么是JVM呢?

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

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


8月福利准时来袭,关注公众号

后台回复:003即可领取7月翻译集锦哦~

往期福利回复:001,002即可领取!

JVM体系结构详解的更多相关文章

  1. [转]JVM指令详解(上)

    作者:禅楼望月(http://www.cnblogs.com/yaoyinglong) 本文主要记录一些JVM指令,便于记忆与查阅. 一.未归类系列A 此系列暂未归类. 指令码    助记符      ...

  2. Linux内核异常处理体系结构详解(一)【转】

    转自:http://www.techbulo.com/1841.html 2015年11月30日 ⁄ 基础知识 ⁄ 共 6653字 ⁄ 字号 小 中 大 ⁄ Linux内核异常处理体系结构详解(一)已 ...

  3. JVM内存详解-阅读笔记

  4. JVM结构详解

    JVM 结构详解 JVM 结构图 程序计数器(PC 寄存器) 程序计数器的定义 程序计数器是一块较小的内存空间,是当前线程正在执行的那条字节码指令的地址.若当前线程正在执行的是一个本地方法,那么此时程 ...

  5. Android OS体系结构详解

    Google于2007年11月5日宣布的基于Linux平台的开源手机操作系统的名称,该平台由操作系统.中间件.用户界面和应用软件组成,号称是首个为移动终端打造的真正开放和完整的移动软件. 架构详解 下 ...

  6. Oracle体系结构详解

    对于一门技术的学习,尤其是像Oracle database这种知识体系极其庞杂的技术来讲,从宏观上了解其体系结构是至关重要的.同时,个人认为,未必是专业DBA人员才需要了解其体系结构(固然对于数据库专 ...

  7. 一篇看懂JVM底层详解,利用class反编译文件了解文件执行流程

    JVM之内存结构详解 JVM内存结构 java虚拟机在执行程序的过程中会将内存划分为不同的区域,具体如图1-1所示. 五个区域 JVM分为五个区域:堆.虚拟机栈.本地方法栈.方法区(元空间).程序计数 ...

  8. JVM组成详解

    一.JVM 整体组成 JVM 整体组成可分为以下四个部分: 类加载器(ClassLoader) 运行时数据区(Runtime Data Area) 执行引擎(Execution Engine) 本地库 ...

  9. java异常体系结构详解

    前几天在参加网易和360公司的在线考试的时候,都出了一道关于java中异常类的多项选择题.这几天翻看了相关书籍和网上一些资料,结合自己的理解与思考,将自己的一些收获记录如下: 先来看看java中异常的 ...

随机推荐

  1. 学习LayUI时自研的表单参数校验框架

    开发背景&痛点:每次写前端的表单的时候需要对表单里用户填写的内容进行校验,减少服务器压力,提前对已知错误对用户提示.每次会要写很多的if else等等对输入框中的内容进行判断,并对为空.格式不 ...

  2. web前端开发-博客目录

    web前端开发是一个新的领域,知识连接范围广,处于设计与后端数据交互的桥梁,并且现在很多web前端相关语言标准,框架库都在高速发展.在学习过程中也常常处于烦躁与迷茫,有时候一直在想如何能够使自己更加系 ...

  3. JQuery制作简易的考试答题管理系统

    网页效果: 代码部分: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> & ...

  4. python 感悟

    * 优美胜于丑陋.* 显式胜于隐式.* 简单胜于复杂.* 复杂胜于难懂.* 扁平胜于嵌套.* 稀疏胜于紧密.* 可读性应当被重视.* 尽管实用性会打败纯粹性,特例也不能凌驾于规则之上.* 不要忽略任何 ...

  5. Linux vim基本的使用方法

    一.vim 的三种模式 (1) 插入模式 在插入模式中,才能输入文字:要进入插入模式,可以按键 “i”:如果要进入插入模式时,直接切换到下一行,可以输入“o”: (2) 命令模式 在命令模式中,主要进 ...

  6. Django是如何防止注入攻击-XSS攻击-CSRF攻击

    注入攻击-XSS攻击-CSRF攻击介绍请访问:https://www.cnblogs.com/hwnzy/p/11219475.html Django防止注入攻击 Django提供一个抽象的模型层来组 ...

  7. 【精选】Markdown 语法汇总

    博客园也能Markdown?美滋滋,Markdown真的是好用QAQ. 本文档按照Markdown各种常用语法类别,以文字描述+演示的方式来展现markdown语法的使用.Markdown 的目标是实 ...

  8. pikachu

    题目链接:http://127.0.0.1/pikachu-master/vul/sqli/sqli_id.php 题目来源:pikachu-->SQL-inject-->数字型注入(po ...

  9. Linux文件及目录管理

    1.Linux文件目录树 /:根目录,linux文件系统的最顶端和入口 bin:存放用户二进制文件(如:ls,cd,mv等),实则/user/bin的硬链接(相当于Windows系统的快捷方式) bo ...

  10. C# 发送邮件 并自定义邮件格式

    话不多说,直接上代码 //邮件提醒 string Body = @"Dear " + list.Rows[i]["people"] + ":<b ...