【101】JVM architecture介绍



  • 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程序是怎么被执行的。以后有机会还会继续细讲JVM各个部分的Implementation是如何别实现的。

    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, 然后我们会用java app去执行整个程序。下面几幅图解释了这背后发生的事。

    0_1470107280896_j7.jpg
    这是一个简化的流程: class loader先将开发者编译的app.class和基本的.class文件load到RAM里面,这过程也load了其它基本的.class文件: 比如说String对应的的 .class, collection 的 .class,或者object 的 .class文件。

    经过了class loader的处理后,产生了byte code instruction, 放到execution engine里面, 然后execution engine会通过Native method calls来执行程序。

    0_1470107305106_j8.jpg

    这个流程还可以分成3个主要成分去分析

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

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

    0_1470107345581_j9.jpg

    loader subsystem:

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

    0_1470107417255_j10.jpg

    0_1470107442007_j11.jpg

    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就是用别的语言写出来的编程语言

    0_1470107689073_j12.jpg

    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:
    http://www.artima.com/insidejvm/ed2/jvm.html
    http://www.javatpoint.com/internal-details-of-jvm
    http://www.cubrid.org/blog/dev-platform/understanding-jvm-internals/
    http://www.javaworld.com/article/2076604/hotspot–a-new-breed-of-virtual-machine.html
    https://dzone.com/articles/understanding-jvm-internals

    本篇小编:Jiaming Xie



  • 我正在整理这门课,期待着和大家见面



  • Java的 link检查原来是在loader system里进行? 不应该是在编译的时候就被检查过了吗?


登录后回复
 

与 BitTiger Community 的连接断开,我们正在尝试重连,请耐心等待