一、类加载模型
运行内存
1.堆用来创建对象和数组, 线程共享。
2.栈是针对的每个线程,栈帧:是每个方法。
二、栈
一、栈枕中的局部变量表&操作数栈
通过javap -c 命令编译对应的汇编语言
解读commpute()
0. 将int类型的常量1 压入操作数栈。
1.将操作数1存入局部变量a中。
2.同理2也一样。
3.iload_1 从局部变量1中装载int类型,到操作数栈中。
4.iadd执行int类型的加法。遇到iadd指针从操作数栈中,弹出栈顶,操作数1和2,然后做类加,并且压入操作数栈。
5.bipush 10 将操作数10压入操作数栈中。
6.imul操作和iadd操作一样。
7.istore_3 将int类型的值存入局部变量3中。
8.iload_3 将3的值拿出来放到操作数栈中。
9.ireturn 返回退出栈帧。
二、动态链接
将符号转变为具体对应的代码(方法区)地址,放到我们动态链接里面。例如:compute() 这个括号解析的时候,直接对应具体的地址。
三、方法出口
方法结束返回到我们的出口处。
三、方法区
jdk1.8之后,叫元空间,存放常量、静态变量、类的基本信息。
四、堆
1.当new对象的时候,首先向eden区域申请空间,如果eden申请不到那么就会gc,gc是根据可达性算法,从栈的本地变量,静态变量、本地方法栈中的向下找,只要有引用的,都会拷贝到s0区域。剩余在eden区域的都会保留着。
可达性算法
Gc Roots根节点:线程栈的本地变量、静态变量、本地方法栈的变量等等。