将JAVA 虚拟机内存模型进行简化,可以简单的分为三个区域:虚拟机栈 stack、堆 heap、 方法区 method area。
虚拟机栈(简称:栈)的特点如下:
- 栈描述的是方法执行的内存模型。每个方法被调用都会创建一个栈帧(存储局部变量、操作数、方法出口等)
- 栈的存储特性是“先进后出,后进先出”
堆的特点如下:
堆用于存储创建好的对象和数组(数组也是对象)
方法区(又叫静态区,也是堆)特点如下:
方法区实际也是堆,只是用于存储类、常量相关的信息!
public class Person {
String name;
int age;
public void show(){
System.out.println("姓名:"+name+",年龄:"+age);
}
}
public class TestPerson {
public static void main(String[ ] args) { // 创建p1对象
Person p1 = new Person();
p1.age = 24;
p1.name = "张三";
p1.show();
// 创建p2对象
Person p2 = new Person();
p2.age = 35;
p2.name = "李四";
p2.show();
}
}
分析:
从main方法开始执行,首先在虚拟机栈中建立一个main方法的栈帧,args为null;然后创建了一个新的对象p1,p1的初始值为null,于是需要在堆中为p1开辟一块新的地址空间,假设地址为0x11,p1的值即为0x11, name初始值为null,age初始值为0,show方法是一个公有的东西,所以应该将show方法的信息放在存放在方法区里的Person类里面,同时new Person( )调用了Person类的构造方法,故应在虚拟机栈中为构造方法也创建一个栈帧。Person p1 = new Person();运行结束后,构造方法的帧栈出栈。至此,Person p1 = new Person();的内存分析就算完成了。
继续往下执行,age的值为24,由于字符串不是基本数据类型,所以"张三"这个字符串应该放在Person类的常量池里,show方法的信息也存放在Person类里。p1.show( ),show方法被调用,所以应在虚拟机栈中创建一个帧栈(构造方法的帧栈已经出栈),this指当前对象p1,故地址为0x11.。p1.show( )运行结束后,其帧栈出栈。
同上过程
程序运行结束,所有东西都被清空。