JVM虚拟机结构

 

对于jvm虚拟机也看过不少东西, 不过都没有进行总结过, 就这样记记忘忘, 这样的习惯不是太好, 所以腾出来时间, 根据«Java 虚拟机规范»这本书, 再把这些知识点回顾并整理下来.

虚拟机的数据类型

数据结构

原始类型(原始值)

数值类型
  • 整数类型

    • byte类型
    • short类型
    • int类型
    • long类型
    • char类型
  • 浮点类型

    根据IEEE754的标准一样

    • float类型
    • double类型
boolean类型

boolean类型会在编译之后被转化为int类型, 1表示true, 0表示false, 在Oracle虚拟中, boolean数组会被转化为byte数组

returnAddress类型

引用类型(引用值)

类类型
数组类型
  • 组件类型
  • 元素类型
接口类型

虚拟机的运行时数据区

运行时数据区

pc寄存器

保存着当前方法正在执行的字节码指令的地址

虚拟机栈

虚拟机栈是可以规定最高的深度, 以及内存大小. 如果超过虚拟机允许的最大容量, 虚拟机抛出StackOverFlowError异常

虚拟机栈是可以动态扩展的, 如果在扩展时无法申请到足够的内存, 或者新创建的线程无法申请到足够的内存来创建虚拟机栈, 那么将会抛出OutOfMemoryError异常

栈帧

栈帧中可以附加调试信息

  • 局部变量表

    变量表的长度在编译期就已经决定, 单个长度32位, 所以如果有double or long类型, 需要连续剧占用两个变量表的位置. 变量表的长度大于等于零, 如果调用的是实例方法, 那么0位置保存着对当前实例的引用

  • 操作数栈

    用于具体数据运算比较的FIFO栈, 最大深度编译器决定, double, long类型占用两个连续的位置, 通过具体的字节码, 来对操作数栈中的数值进行运算.

  • 动态链接

    指向当前方法所在类型的运行时常量池的引用. 以便对当前方法进行动态链接.动态链接的作用就是将方法调用中的符号引用转化为对实际方法的直接引用. 晚期绑定的实现基础.

本地方法栈

方法区

线程共享,储存着每一个类的结构信息.

运行时常量池

保存着数值字面量, 在运行解析之后才能获得方法或者字段引用. 运行时常量池的内容并不一定来自class文件中. 运行时常量池不等于字符串常量池, 字符串常量池在堆中.

字段
方法数据
构造函数
普通方法
类,实例,接口初始化用到的特殊方法

线程共享,所有类实例和数组对象分配内存的区域. GC的主要针对区域.

未完待续