2. JVM内存模型
2023-08-22 18:33:04 11 举报
JVM内存模型
作者其他创作
大纲/内容
this
iadd
方法执行后回到那一行继续执行main方法
局部变量表
user
compute 栈帧
1
常量2压入
0: iconst_11: istore_12: iconst_23: istore_2
方法区(元空间)
局部变量表的索引位置1=a局部变量表的索引位置0=this,指的是调用这个方法的对象
类似数组结构
a=1
3
操作数栈
b=2
30
将字节码文件放到内存区域
选中a_Math.class,右键Open in Terminal,javap -c a_Math.class a_Math.txt 生成比较可读的JVM指令
7: bipush 109: imul
程序计数器(PC寄存器)
4: iload_1 5: iload_26: iadd
栈(main线程). . .
imul
程序计数器
10
一个线程对应一个独立的栈内存空间,每一个方法对应一个栈帧内存区域方法执行满足栈的FILO,先结束的方法从栈顶弹出
方法出口
栈帧
JVM虚拟机
堆 —> 堆内存;方法区 + 栈 —> 操作系统的直接内存。比如操作系统物理内存8G,堆分配3G,那么方法区+栈 用的是5G的那部分内存。故理论上同等的物理内存,栈设置的越大,能开启的线程数越小
CPU高速缓存
记录代码执行的位置
a_math
2
10: istore_3 11: iload_312: ireturn
出栈
动态链接
Java Math.Class
类装载子系统(C++)
堆:存放 new 创建的对象,-Xms,-Xmx方法区(元空间):存放 常量+静态变量+类信息,-XX:MetaspaceSize,-XX:MaxMetaspaceSize本地方法栈:存放本地方法(native)的变量,JVM核心代码都是C语言实现的
执行程序代码
操作数在程序运行过程中要做操作的一块临时中转存放空间
main方法内部的compute方法在程序加载时不会解析符号,而是在程序运行过程中解析,把这种方法的符号引用转换成直接引用(存放对应在方法区的位置)
常量1压入
运行时数据区(内存模型)
main 栈帧
本地方法栈
文本
c=30
堆
栈(线程)
a
橘色是共享的区域,紫色是每个线程独立的区域
字节码执行引擎(C++)
0 条评论
下一页