目录
一.JVM内存架构
JVM内存模型总体预览:
JVM内存结构主要分为图中的几个内存区域:
1.虚拟机栈
2.本地方法栈
3.程序计数器
4.堆
5.方法区
二.虚拟机内存结构:
1.1 虚拟机栈
此区域是线程私有的,虚拟机栈描述的是Java方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧(stack frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息(如果想对栈帧有进一步的理解可以看看我写的Class文件结构笔记)。局部变量表中存放了编译器可知的数据类型1.存放基本数据类型 2.引用数据类型。如果是基本数据类型,那么将数据的值直接放到栈帧里面,如果是引用类型指向的对象是放在堆上的。【reference类型,它不同于对象本身,可能是一个指向对象起始地址的引用指针,也可能是指向代表对象的句柄或者其它与此对象相关的位置】
通俗来说,程序的每一个方法在执行的时候,都会在虚拟机栈创建一个栈帧来供程序运行,当该方法运行完成之后,虚拟机栈就会将这个方法的栈帧弹出,方法运行完成。
例如:
测试程序代码:
public class JVMStack {
public void testStack1(){
System.out.println("调用方法一");
testStack2();
}
private void testStack2() {
System.out.println("调用方法二");
testStack3();
}
private void testStack3() {
System.out.println("调用方法三");
}
@Test
public void test(){
testStack1();
}
}
1.运行test函数,此时只调用了test方法 ,还未进入testStack1方法,可以看到此时的虚拟机栈中只有一个栈帧-test