1. JVM运行时数据区域
1.1 Program Counter (PC)
程序计数器, 存放指令位置, 虚拟机的运行,类似于这样的循环
while(not end){
取PC中的位置,找到对应位置的指令;
执行该指令;
PC++;
}
1.2 Native Method Stacks
本地方法栈,java调用C/C++写的方法(JNI)
一般不去管他,也没办法优化
1.3 JVM Stacks
每个线程对应一个栈,每个方法对应一个栈针
jvm stacks里装的各种栈针
1.3.1 Frame - 栈帧(每个方法对应一个栈帧)
栈针包括以下四部分内容:
- Local Variable Table:局部变量表
- Operand Stack:操作数栈
- Dynamic Linking (jvms2.6.3):Constant Pool的指针
- return address:方法a调用了方法b,b方法的返回值放在什么地方,叫做return address
1.4 Direct Memory(直接内存)
- java1.4以后增加,不归JVM虚拟机管,归操作系统管,用户空间可以直接访问内存空间。JVM可以直接访问内核空间的内存。
- NIO , 提高效率,实现zero copy。
1.5 Method Area(方法区)
存储虚拟机加载的class信息(类的版本、字段、方法、接口),常量,静态常量,即时编译后的代码等
-
Perm Space(<1.8)
字符串常亮位于PermSpace
FGC不会回收
大小启动的时候指定,不能变 -
Mate Space(>=1.8)
字符串常亮位于堆
会触发FGC清理
不设定的话,最大就是物理内存
可以理解为 Perm Space 或 Mate Space 是Method Area不同版本的实现。
1.5 Heap(堆)
java虚拟机最大的内存区域,存放对象实例,也是垃圾收集器管理的主要区域,分为新生代(由Eden加两个Survivor组成)和老生代,再JDK1.8中,young 和 old 比例1:2
可能会抛出OutOfMemoryError异常。
1.6 常用指令集
- 基于寄存器的指令集
- 基于栈的指令集
Hotspot中的Local Variable Table(局部变量表) = JVM中的寄存器
2. 常用指令
- store
弹出操作数栈栈顶元素,保存到局部变量表 - load
变量压入操作数栈 - InvokeStatic
调用类的static方法 - InvokeVirtual
调用对象实例的方法 - InvokeInterface
将属性定义为接口来进行调用 - InovkeSpecial
调用private 方法 , 构造方法
可以直接定位,不需要多态的方法 - InvokeDynamic
lambda表达式或者反射或者其他动态语言(scala kotlin),动态产生的class,会用到的指令