JVM学习05—— JVM 运行时内存结构

发布于:2023-01-22 ⋅ 阅读:(229) ⋅ 点赞:(0)

图解

本章节多结合图解

在这里插入图片描述

细化
在这里插入图片描述

一、方法区(共享)

在这里插入图片描述

方法区是一个抽象的概念,在JDK1.8之前的实现是Perm Space,JDK1.8及之后的实现是Meta Space.
方法区被所有线程所共享,方法区里装 class的结构

1.1 Perm Space 永久区

  1. 字符串常量位于PermSpace永久区
  2. FGC ( 老年代垃圾回收 ) 不会清理

区分 Perm Space 和 Meta Space:
结合GC, 一直创建字符串常量,观察 堆 大小变化
如果FGC了或者堆大小变大。则是1.8+,则是 MetaSpace,否则是Perm Space

  1. 大小启动的时候指定,不能变

1.2 Meta Space 元数据区

  1. 字符串常量位于堆
  2. 会触发FGC清理
  3. 大小不设定的话,最大就是物理内存,如果指定大小,满了就会触发FGC清理

2.0 运行时常量池 Run-Time Constant Pool

放置 .class文件的常量池里的内容

二、堆 Heap(共享)

在这里插入图片描述

堆在线程之间共享。

三、虚拟机栈 JVM Stack

在这里插入图片描述
在这里插入图片描述

虚拟机栈用来执行Java方法 , 每个线程对应一个栈;
栈里包括frame (栈帧) ; 每个方法对应一个栈帧
栈帧用来存储数据、执行动态连接

  1. 局部变量表 Local Variable Table
  • 静态方法 0 位置依次是入参,然后才是局部变量
  • 非静态方法 0 位置是this,依次是入参,然后才是局部变量
  1. 操作数栈 Operand Stack
  2. 动态连接 dynamic Linging
    连接到.class文件的常量池,如果引用没有解析就给解析
  3. 返回地址
    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相关,提高效率,零拷贝,