操作系统的内存分区
-
栈Stack
-
堆Heap
-
未初始化数据段Bss
-
数据段DataSegment
-
文本段LiteralSegment
-
代码段CodeSegment
JVM的内存分区
- 程序计数器PC
- 虚拟机栈JVM Stack
- 本地方发栈Native Stack
- 堆Heap
- 方法区Method Area
JVM的内存分区
方法区和堆是线程共享的。
这些是独占的。
程序计数器:用于存储指令地址,交给虚拟机执行相关指令。
public class testJVM {
public static void main(String[] args) {
int a=0;
while(a>10){
a++;
}
}
}
反编译生成字节码文件,查看其指令地址
虚拟机栈:在程序的执行过程中进行方法的调用,即栈帧的入栈出栈
public void funA(){
int a=1;
funB(a);
}
public void funB(int a){
}
先是方法a入栈,调用方法b时将方法b压入栈中。
重点:1.栈帧
2.生成时机
3.构成
局部变量表
1.主要存储方法的参数方法内的局部变量
2.基本存储单元为变量槽
3.本质是一个数字数组,byte,char,short,boolean都会转换为int类型,0为false,1为true
4.它的大小在编译器就会生成,运行的时候不会改变大小
操作数栈:用来存储方法的变量和中间值,方便虚拟机顺序读取操作数执行操作指令
public void c(){
int a=1;
int b=2;
int sum=a+b;
}
执行上述代码时,我们先javap反编译得到字节码文件
查看字节码文件发现其操作指令如下:
0 : iconst_1 1 : istore_1 2 : iconst_2 3 : istore_2 4 : iload_1 5 : iload_2 6 : iadd 7 : istore_3 8 : return
1.iconst_1先读取a=1变量,istore_1将a=1存入局部变量
2.iconst_2再读取b=2变量,istore_2将b=2存入局部变量
3.iload_1将a=1,iload_2将b=2,压入栈中
4.iadd弹出a=1,b=2两个操作数,计算相加的和压入栈中
在多个方法的操作数栈:
动态链接:上期已经详细说明,在类加载过程中
返回地址:分为正确执行的返回,以及运行时错误返回地址。



