图解JVM运行时数据区
前沿
Q1:为何要图解?
在我自己学习JVM的时候,啃过很多相关的书籍,但是总是不能形成一个长久的记忆。书上晦涩的词语即使当时记住了但是长久不用也会忘记。用图解的方式就是作者亲自使用的一种能帮助形成长久记忆的方法。(一图胜千言)
引用一段话
但是, 最重要的 还是 要 看到 它。 人类 是 一种 有 视觉 思想 的 动物。 眼睛 所 注视 的 印象 可以 经久不衰。 我们 经常 可以 记住 某 人的 脸, 即使 我们 记 不住 他的 姓名。 从 眼睛 通往 脑部 的 神经, 比 从 耳朵 通往 脑部 的 神经 要 大 25 倍。 中国 有 一句 格言“ 百 闻 不如 一见。”
戴尔·卡耐基(Carnegie.D.). 人性的弱点大全集(超值金版) (Kindle 位置 5681-5683). 立信会计出版社. Kindle 版本.
知识前提
读者需要具备:
1.知道Java 是运行在JVM(Java Virtual Machine)
2.知道JVM是一个由C++编写的程序的概念(native 方法)
3.要知道java程序是如何运行的
知识点
- JVM 运行时数据区
- 方法区
- 堆(堆外NIO)
- 程序计数器
- 虚拟机栈(VMStack)
- 本地方法栈
JVM运行时数据区
我们们可以按照 **数据** 和 **指令** 把JVM的运行数据区分为两块
数据用大白话讲就是存东西的,
例如Heap 存储了Java种的对象,数组
例如方法区存储了类信息(class)/ 常量()(1.7+有变化)/ 静态变量/ JIT (1.7以前)
下面一个一个来说
指令-虚拟机栈(VM Stack)
- Stack
我们大学里学过数据结构,Stack
如果没理解,借用小时候用的这种塑料存钱钱罐就知道了(感觉挺形象的)
首先我们要知道一个线程(Thread)会对应一个栈(Stack)
栈的大小时多少呢?JDK1.7默认是 1mb
下面一个方法运行的例子对应的栈的变化是怎么样的
- Stack Frames (栈帧)
一个方法就代表一个栈帧,方法执行的时候,例:执行methodOne
就会压入到该线程(Thread,在一个线程中是顺序执行的)的栈中
若该 methodOne 调用,methodTwo 那么 methodTwo 就会压栈,
(根据栈的特性要mTwo 执行结束了出栈了mOne 才能继续执行)
附IDEA中调试的栈信息GIF:
- 栈帧中的参数介绍(只介绍了比较关键的几个)
- 局部变量表
局部变量表是存储该栈帧中执行过程中数据的区域
java的基本数据类型 (byte char short int long float double boolean)是直接存在这里的,
(这一部分是存在堆(heap)外的,不通过GC 回收的)
java的对象和数组,是存在Heap里的,局部变量表中记录一个指向堆中对象的指针。
(引深:我们学GC的时候讲 强引用的时候看到这句话 ”被局部变量表中变量直接或者间接引用的对象都不会被回收“ 就是这个意思)
- 栈帧中的参数介绍(只介绍了比较关键的几个)
- 操作数栈
- 动态链接
- 出口
( java 栈和栈帧: https://www.cnblogs.com/minisculestep/articles/4934947.html)
指令-程序计数器
指向当前线程正在执行的字节码指令的地址 行号
指令-本地方法栈
natvie 方法用 c++ 实现
(引深:HashMap 的hash 算法就是先从 对象中调用这里的 native int hasCode();)
/**
* 删除方法注释的Object类
* Class {@code Object} is the root of the class hierarchy.
* Every class has {@code Object} as a superclass. All objects,
* including arrays, implement the methods of this class.
*
* @author unascribed
* @see java.lang.Class
* @since JDK1.0
*/
public class Object {
private static native void registerNatives();
static {
registerNatives();
}
//native 方法存于 本地方法栈
public final native Class<?> getClass();
//native 方法存于 本地方法栈
public native int hashCode();
....
}
数据-方法区
https://blog.csdn.net/youngyouth/article/details/79933612
数据-堆
前面讲了,每个线程都对应一个虚拟机栈,对应一个程序计数器,
线程共享堆(Heap)