JVM-006-运行时数据区
一、运行时数据区
 运行时数据区是由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,会用到的指令