JVM
2024-02-01 10:23:47 7 举报
JVM内存模型
作者其他创作
大纲/内容
方法区是来存静态变量,常量,字节码文件等
当mian方法中的computer()方法执行完毕之后,记录下一步要执行的方法的位置
程序计数器
a=1
main()栈帧
Survivor2
Math.class
b= 2
方法区(元空间)
执行操作0:先把数字1压栈。执行操作1:在局部变量表中分配一块a的内存区域然后数字1出栈,放到a所在内存区域里来。执行操作2:(等于操作0).....
User
内存区域:堆内部一共有4个区域,新生代中3个内存的比例为8:1:1。新生代和老年代的内存比例为1:2。大对象直接进入老年代:大对象:大量连续内存空间的Java对象垃圾回收:当Eden区满了的时候,触发一次Minor GC。如果对象在Eden出生并经过第一次Minor GC后仍然存活并且能被Survivor容纳的话,将被移动到Survivor空间中并且对象年龄设为1对象在Survivor区中每“熬过”一次Minor GC,年龄就增加1岁,当它的年龄增加到一定程度(默认为15岁),就将会被晋升到老年代中。
栈(线程)
main线程
full GC
math
Survivor1
(2/3)
示例代码:public class Math { public static final int initData = 666; public static User user = new User(); public int compute() { int a = 1; int b = 2; int c = (a + b) * 10; return c; } public static void main(String[] args) throws IOException { Math math = new Math(); math.compute(); System.out.printin(\"end\"); } }
老年代
紫色的区域是每个线程独有的内存空间
old
新生代
局部变量表
堆
字节码执行引擎:1.执行编译后的字节码文件2.修改程序计数器当前运行到的位置
javac Math.class
动态链接
JVM虚拟机
computer()方法的汇编过来的执行步骤public int compute();Code:0: iconst_11: istore_12: iconst 23: istore_24: iload 15: iload 26: iadd7: bipush 109: imul10: istore_311: iload_312: ireturn
FIFO 栈
minor GC
方法出口
javac Math.java
程序计数器记的是当前线程下一步要执行的操作的内存地址原因:在多线程环境下,比较实用,当前线程等待的时候,程序计数器记住下一步的地址,等到当前线程抢到cpu时间片的时候,可以直接执行下去程序计数器计的数是通过字节码执行引擎修改的
字节码执行引擎
线程2
操作数栈
computer()栈帧
Eden
修改
math.compute();这个方法是在main线程中引用的一个方法,动态链接就是直接把这个computer()给它分配到真正的computer()方法的地址中去math.compute()方法是程序运行时去加载的,而不是类被加载的时候去加载的
执行
类装载子系统
user
本地方法栈
0 条评论
下一页