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文件loadRAM里面,这过程也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介绍