JVM architecture介绍

by Jiaming

What is JVM?
A Java virtual machine (JVM) is an abstract computing machine that enables a computer to run a Java program.

开始前先理清楚涉及JVM三个层面的概念:
  1. Specification: 对JVM的定义,architecture的设计 
  2. Implementation: JVM中具体的算法实现,比如Garbage collection算法具体实现 (Implementation of JVM也被称为JRE, java runtime environment)
  3. 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个主要成分去分析

  1. Loader subsystem 
  2. Runtime data area
  3. Execution engine

下面会一一介绍每个部分的功能。

3.
   loader subsystem:
  1. load:
    1. Application class loader: 主要是load开发者的.class文件
    2. Bootstrap class loader: load JAVA API 的 .class文件
  2. link:
    1. Verify, 主要检查class和interface结构的正确性
    2. Prepare, 用于allocate memory给.class file里面的static variables
    3. Resolve, 主要是讲symbolic reference改成具体的一个值
  3. initialize:
    1. 主要进行class和interface的初始化


4.

Run time data area:
  1. Method(class) data: 主要用于储存class的定义,另外还有method data, field, 和method的code
  2. Heap: 主要用于储存程序运行时所产生的Object 
  3. PC Register: 全称是program counter register, 主要用于存放下一个JVM instruction的reference
  4. JAVA Stack:主要用于储存method运行时的数据,
  5. Native method stack: 这是native method被执行的地方. Native method就是用别的语言写出来的编程语言

6.

Execution Engine:
  1. Interpreter:主要功能是读bytecode,然后执行相对应的instructions.
  2. JIT(Just-in-time) Compiler:这个部分主要是用以优化execution engine的性能,一般execution engine会先用interpreter去解释bytecode, 然后执行对应的命令。在很多时候,JIT compliler可以将相类似的bytecode都翻译成native code,然后直接运行。直接执行native code会比bytecode快。
  3. Hotspot profiler: 这个部分也是用来优化性能的,当某些method被多次使用时,Hotspot这个部分就会用profiler去记录那些method所对应的native code, 这样就可以直接用native code而不是byte code了。
  4. Garbage collector: 这个部分主要负责内存的管理,当程序中的object不再被用的时候,garbage collector会将其删除。








Resources:
  1. http://www.artima.com/insidejvm/ed2/jvm.html
  2. http://www.javatpoint.com/internal-details-of-jvm
  3. http://www.cubrid.org/blog/dev-platform/understanding-jvm-internals/

Comments

Popular posts from this blog

OAuth Authorization介绍