推荐阅读: The JVM Architecture Explained
jvm结构图:
运行时数据区域
-
线程私有区域: 线程私有区域主要包含栈帧、程序计数器、本地方法栈。
-
**栈帧:
栈帧中包含局部变量表、操作栈、动态链接、以及方法返回地址;局部变量表:如常量池key-value形式: key是数据编号, value既可以是另外其他常量的编号, 也可以直接是字符串. #1 = Class #22 #22 = Utf8 java/lang/object操作栈: Java源码对应的字节码指令序列程序计数器中所存储的下一条指令就是操作栈指令的地址或下标动态链接: 操作栈中的指令号(引用), 如通过#1的方式指向常量池某个具体的变量值或者某个指令可以有效减少冗余字节码的数量, 对字节码进行编号, 在使用时通过指令号的方式进行引用, 类似于代码编写时对一些通用的函数和变量值进行封装.方法返回地址;栈帧的作用: 方法执行的载体, 解决程序如何运行的问题为方法执行提供所需数据内存区域, 维系着方法执行中的各种计算所需要的数据调用方法 = 创建栈帧+入栈, 方法结束 = 方法返回+出栈常见问题: 栈帧空间不足: 超过预设的栈帧固定空间大小, 抛stackoverflowError内存空间不足: 栈帧无法动态扩展, 抛OOM(outofmemory)**
-
程序计数器: 基于操作栈来理解程序计数器更容易, 存储操作栈中的具体的指令号, 不会进行垃圾回收, 也不会有OOM问题.
-
线程共享区域: