zoukankan      html  css  js  c++  java
  • JVM架构

    1 JVM的内存模型

    1.1 堆空间

    每个jvm都有一个堆,所有的对象都放在这里。

    1.2 java栈空间

    每个线程都有一个java栈,所有的java栈都放在这里。

    1.3 本地方法栈

    每个线程都有一个本地方法栈。

    1.4 pc寄存器

    每个线程都有一个pc寄存器。

    1.5 方法存储区

    每个jvm只有一个方法存储区,方法名、类的全路径名等。

    1.6 类的静态变量是存放在堆空间中的

    类的静态变量是存放在该类的class对象中,而class对象是存放在堆中的。

    1.7 字符串常量池

    jvm单独维护了一个常量池,用来存放所有的字符串常量,它本质上是一个hash table,大小固定。

    jdk6的时候,该字符串常量池是存放在方法区中的,jdk7的时候,该字符串常量池存放在堆中。

    如果一个java程序字符串太多,会导致hash table中的冲突过多,导致访问变慢,影响性能。

    2 JVM的类加载器

    2.1 JVM类加载器的构成

    JVM有三个类加载器:

    引导类加载器,负载加载核心类,即在JAVA_HOME/jre/lib下的类。

    扩展类加载器,负责加载扩展类,即在JAVA_HOME/jre/lib/ext下的类。

    应用类加载器,负责加载应用程序自身的类。

    2.2 JVM类加载器的工作过程

    jvm的类加载器是分等级的,引导类加载器的等级最高,地位最高,扩展类加载器次之,应用类加载器最低。

    加载一个类的时候,地位低的加载器先请求地位高的加载器先加载,只有地位高的不能加载时,才由地位低的类加载器加载。

    这样就保证了核心类的地位。

    2.3 JVM类加载器工作的结果

    第一步,加载

    加载.class文件,生成二进制数据,并且保存在方法存储区。

    第二步,链接

    链接的时候要做的有三件事情,核实类的正确性、为类的变量分配存储空间并且赋值为默认值、符号解析。所谓的符号解析就是通过搜索方法存储区,将symbol换成引用。这样就完成了多个.class文件之间的链接。

    第三步,初始化

    对方法区中的类的静态变量赋值。

    3 JVM的执行引擎

    3.1 每个线程都是JVM执行引擎的一个实例

    这样的话,各个线程之间都是独立的,互不影响。最直观的对JVM执行引擎的理解:芯片中如果直接支持bytecode的话,执行引擎就是线程本身了。

    3.2 引擎工作的过程

    3.2.1 解释器

    bytecode由opcode和oprand构成,它根据bytecode指令取oprand,然后根据opcode执行相应的操作,具体执行的时候肯定是翻译成本地的二进制指令来执行的。

    3.2.2 just in time compiler

    将经常调用的方法事先编译成本地的二进制指令,下次再碰到直接调用即可。

    3.2.3 芯片级别支持bytecode

    直接执行bytecode,bytecode指令就是本地指令。

    4 类加载器和执行引擎的关系

    类加载器已经生成了java应用程序的所有的bytecode,执行引擎就按照bytecode的顺序解释执行即可。

  • 相关阅读:
    矩阵乘法与邻接矩阵
    矩阵加速 学习笔记
    P5596 【XR-4】题
    P1842 奶牛玩杂技
    CF449B Jzzhu and Cities
    小球与盒子
    [JZOJ5279]香港记者题解--最短路图
    [学习笔记]二分图匹配与匈牙利算法
    [NOIP2018模拟赛10.25]瞎搞报告
    luogu2657-Windy数题解--数位DP
  • 原文地址:https://www.cnblogs.com/hustdc/p/8047689.html
Copyright © 2011-2022 走看看