图解
本章节多结合图解
细化
一、方法区(共享)
方法区是一个抽象的概念,在JDK1.8之前的实现是Perm Space,JDK1.8及之后的实现是Meta Space.
方法区被所有线程所共享,方法区里装 class的结构
1.1 Perm Space 永久区
- 字符串常量位于PermSpace永久区
- FGC ( 老年代垃圾回收 ) 不会清理
区分 Perm Space 和 Meta Space:
结合GC, 一直创建字符串常量,观察 堆 大小变化
如果FGC了或者堆大小变大。则是1.8+,则是 MetaSpace,否则是Perm Space
- 大小启动的时候指定,不能变
1.2 Meta Space 元数据区
- 字符串常量位于堆
- 会触发FGC清理
- 大小不设定的话,最大就是物理内存,如果指定大小,满了就会触发FGC清理
2.0 运行时常量池 Run-Time Constant Pool
放置 .class文件的常量池里的内容
二、堆 Heap(共享)
堆在线程之间共享。
三、虚拟机栈 JVM Stack
虚拟机栈用来执行Java方法 , 每个线程对应一个栈;
栈里包括frame (栈帧) ; 每个方法对应一个栈帧
栈帧用来存储数据、执行动态连接
- 局部变量表 Local Variable Table
- 静态方法 0 位置依次是入参,然后才是局部变量
- 非静态方法 0 位置是this,依次是入参,然后才是局部变量
- 操作数栈 Operand Stack
- 动态连接 dynamic Linging
连接到.class文件的常量池,如果引用没有解析就给解析 - 返回地址
a()->b() 方法a调用了方法b,b方法的返回后的地址
四、本地方法栈 Native Method Stack
等同于java自身的栈,不过是C/C++写的本地方法栈 JNI 本地方法接口 java native interface
五、程序计数器 Program Counter Register
程序计数器PC : 存放指令的位置
虚拟机运行
while not end:
取program count中的位置,找到对应的指令
执行该指令
Program count ++
六、直接内存 Direct Memory
JVM可以直接访问的内核空间的内存,由操作系统管理;NIO相关,提高效率,零拷贝,