The JVM Architecture Explained-JVM架构解析(译)

翻译原文:https://dzone.com/articles/jvm-architecture-explained

JVM架构解析

每一个Java开发者都知道字节码是被JRE执行。但是实际上许多人并不知道JRE是JVM的实现能解析字节码,编译代码,并且执行。作为一个开发者了解JVM的架构是非常重要的,因为它会使书写代码更加高效。在这篇文章中我们将更加深入地学习JVM架构和JVM不同的组成部分。

什么是JVM

虚拟机是物理机器的软件实现。Java是发展于WORA (Write Once Run Anywhere)这一观点。编译器将Java文件编译成Java.class文件,然后这个java.class文件被放到JVM 中,装载并执行java.class文件。下面是一个JVM架构图表。


JVM如何工作

如图表所示,JVM分为三大部分

1.      类加载子系统

2.      运行时数据区

3.      执行引擎

1.类加载子系统

Java动态类加载功能是由类加载子系统提供的。它加载,链接,初始化在运行时第一次出现的类的class文件。

1.1 Loading

类在这一模块被加载。Boot Strap class Loader, Extension class Loader, Application class Loader 这三个loader协助实现。

1. Boot Strap class Loader,负责加载位于bootstrap classpath下的类。

2. Extension ClassLoader,负责加载位于ext folder (jre\\lib).下的类

3. Application ClassLoader,负责加载位于应用级别的路径,路径提到的环境变量等。

在加载时会有委派分层算法。

1.2 Linking

a)      验证

字节码验证者将会验证生成的字节码是否符合规范,如果验证失败将得到验证错误。

b)      准备

对于所有的静态变量,内存会分配,并设置默认值。

c)      Resolve

所有的符号内存引用都被方法区的原始引用所取代。

1.3初始化

这是类加载的最后阶段,所有的静态变量将被分配原始值,静态块将被执行。

2.运行时数据区

运行时数据区主要被分为5个模块。

2.1. 方法区

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

2.2. 堆区

所有的对象和他们相应的实例变量,数组都会被存储到这里,每个JVM堆区只有一个。由于方法区和堆区共享多个线程的内存,存储数据不是线程安全的。

2.3. 栈区

每一个线程,都会创建一个独立的运行时栈,对于每个方法调用,会在栈存储器中创建一个栈帧条目。所有的本地变量都会在栈内存汇总创建,说栈区域是线程安全的,因为它不是一个共享资源。栈帧被分为三个实体:

a) 局部变量数组-相关方法的局部变量及其值将会存储在这里

b) 操作数栈-如果需要任何中间操作,操作数栈将作为运行时工作区来执行操作。

c) 帧数据-对应于该方法的所有符号存储在这里。在任何异常情况下,捕获的信息将保持在帧数据中。

2.4.    PC 寄存器

每个线程都有一个独立的PC 寄存器, 以保持当前执行指令的地址,一旦这条指令被执行,PC 寄存器就更新至下一条指令

2.5.    本地方法栈

本地方法栈保存了本地方法信息,对于每一个线程,将创建一个单独的本地方法栈。

3. 执行引擎

经过运行时数据区分配的字节码被执行引擎执行。执行引擎阅读字节码,并一块一块地执行。

3.1.      解释器

解释器解析字节码很快,但执行很慢。解释器的缺点是当一个方法被多次调用,每一次都需要新的解释。

3.2.     JIT编译器

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

a)中间代码生成器-产生中间代码。

b)代码优化器-负责优化上面生成的中间代码。

c)目标代码生成器-负责生成机器代码或者本地代码。

d)实践探查器-一个特殊的组件,负责发现热点,如某个方法被多次调用或者未被调用。

3.3.      垃圾回收

收集和移除未引用的对象。垃圾回收可以通过调用“System.gc()”,但执行是没有保证的。JVM的垃圾回收收集已经创建的对象。

Java Native Interface (JNI):JNI将和本地方法库相互作用,并为执行引擎提供所需要的本地库。

Native Method Libraries(本地方法库):它是一个被执行引擎所需的本地库的集合。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,784评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,745评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,702评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,229评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,245评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,376评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,798评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,471评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,655评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,485评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,535评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,235评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,793评论 3 304
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,863评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,096评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,654评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,233评论 2 341

推荐阅读更多精彩内容