JVM architecture介绍
by Jiaming
假设我们现在有app.java这个程序要运行,那么具体的流程到底是怎么样的呢?
我们会先运行 javac app.java, 然后这个程序会被编译,产生了app.class这个file,
1.
2.
这个流程还可以分成3个主要成分去分析
下面会一一介绍每个部分的功能。
3.
loader subsystem:
4.
Run time data area:
6.
Execution Engine:
What is JVM?
A Java virtual machine (JVM) is an abstract computing machine that enables a computer to run a Java program.
开始前先理清楚涉及JVM三个层面的概念:
- Specification: 对JVM的定义,architecture的设计
- Implementation: JVM中具体的算法实现,比如Garbage collection算法具体实现 (Implementation of JVM也被称为JRE, java runtime environment)
- Instance: 执行JAVA程序的 JVM实例, 其生命周期随着JAVA程序的开始而开始,也随着JAVA程序的结束而结束,每个JAVA程序都各自在一个JVM instance里面运行, 但是一个JAVA程序如果有multithread, 只会在一个Instance里面运行。
这篇文章主要关注的是 Specification, 即是architecture上的设计,希望通过理解JVM去了解一个JAVA程序是怎么被执行的, 从而更深层次地理解JAVA语言的特点。以后有机会还会继续细讲JVM各个部分是如何别实现的。
JVM主要的功能:
- Loads code
- Verifies code
- Executes code
- Provides runtime environment
JVM 还对以下成分做了定义
- Memory area
- Class file format
- Register set
- Garbage-collected heap
- Fatal error reporting etc.
假设我们现在有app.java这个程序要运行,那么具体的流程到底是怎么样的呢?
我们会先运行 javac app.java, 然后这个程序会被编译,产生了app.class这个file,
1.
这是一个简化的流程: class loader先将开发者编译的app.class和基本的.class文件load到RAM里面,这过程也load了其它基本的.class: 比如说String lib对应的的 .class, collection 的 .class,或者object 的 .class文件。
经过了class loader的处理后,产生了byte code instruction, 放到execution engine里面, 然后execution engine会通过Native method calls来执行程序。
2.
这个流程还可以分成3个主要成分去分析
- Loader subsystem
- Runtime data area
- Execution engine
下面会一一介绍每个部分的功能。
3.
loader subsystem:
- load:
- Application class loader: 主要是load开发者的.class文件
- Bootstrap class loader: load JAVA API 的 .class文件
- link:
- Verify, 主要检查class和interface结构的正确性
- Prepare, 用于allocate memory给.class file里面的static variables
- Resolve, 主要是讲symbolic reference改成具体的一个值
- initialize:
- 主要进行class和interface的初始化
4.
- Method(class) data: 主要用于储存class的定义,另外还有method data, field, 和method的code
- Heap: 主要用于储存程序运行时所产生的Object
- PC Register: 全称是program counter register, 主要用于存放下一个JVM instruction的reference
- JAVA Stack:主要用于储存method运行时的数据,
- Native method stack: 这是native method被执行的地方. Native method就是用别的语言写出来的编程语言
6.
Execution Engine:
- Interpreter:主要功能是读bytecode,然后执行相对应的instructions.
- JIT(Just-in-time) Compiler:这个部分主要是用以优化execution engine的性能,一般execution engine会先用interpreter去解释bytecode, 然后执行对应的命令。在很多时候,JIT compliler可以将相类似的bytecode都翻译成native code,然后直接运行。直接执行native code会比bytecode快。
- Hotspot profiler: 这个部分也是用来优化性能的,当某些method被多次使用时,Hotspot这个部分就会用profiler去记录那些method所对应的native code, 这样就可以直接用native code而不是byte code了。
- Garbage collector: 这个部分主要负责内存的管理,当程序中的object不再被用的时候,garbage collector会将其删除。
Resources:
Comments
Post a Comment