一、运行时数据区
 运行时数据区是由6个部分组成的Method Area 方法区、VM Stacts 虚拟机栈、Native Method Stacts 本地方法栈、Heap 堆、Program Counter Register 程序计算器,Direct Memory 直接内存。了解他们,能够更好的理解Java程序在JVM中是如何运行的。
1、Program Counter Register
 程序计数器。线程私有。存放指令的位置。
 简单的来说,CPU切换线程时,记录该线程执行的指令的位置。
2、Direct Memory
直接内存
JVM可以直接访问kernel空间的内存(os 管理的内存)
3、Native Method Stacts
 本地方法栈。线程私有。
 JVM能够调用C或C++写的方法。此区域无法调优。
4、VM Stacts
 虚拟机栈。线程私有。
 VM Stacts有一个比较重要的概念,Frame 栈帧。每一个方法对应着一个Frame。
 那么,这个Frame里有什么?
(1)Frame
 Frame也有四个部分组成Local Variable Table、Operand Stack、Dynamic Linking、return address
 接下来,了解一下它们吧。
1. Local Variable Table
 局部变量表。
2. Operand Stack
 操作数栈。
3. Dynamic Linking
 动态链接。
 方法a调用了方法b,方法b存放在运行时常量池中,方法a到运行时常量池找到方法b,这个就被称作Dynamic Linking。
4. return address
 方法a调用了方法b, b方法的返回值放在什么地方
5、Method Area
 方法区。
 JDK v1.8之前,该区域的实现者是Perm Space。字符串常量位于PermSpace。FGC不会清理。大小启动的时候指定,不能变。
 JDK v1.8之后,该区域的实现者是Meta Space。字符串常量位于堆。会触发FGC清理。不设定的话,最大就是物理内存。
6、Heap
堆。
常见的指令集
- store
- load
- pop
- mul
- sub
- invoke
- InvokeStatic
- InvokeVirtual
- InvokeInterface
- InovkeSpecial:
可以直接定位,不需要多态的方法
private 方法 , 构造方法 - InvokeDynamic:
JVM最难的指令
lambda表达式或者反射或者其他动态语言scala kotlin,或者CGLib ASM,动态产生的class,会用到的指令
网友评论