一、内存模型简介
首先,我们的代码的内存分配都是在jvm上进行的,jvm是应用程序和操作系统的桥梁,正是jvm机制解决了跨平台的问题。所以,java程序的内存分配都是在jvm上进行的。下面说一下常见的内存:寄存器、栈内存、堆内存、常量池。
寄存器:jvm内部虚拟寄存器,存储速度很快,程序不可控制。
栈内存:用来保存局部变量的值,主要是基本类型的值和局部对象的引用指针。
堆内存:存放动态产生的数据,通过new关键字产生的对象。创建出来的对象包含自己的成员变量,并不包含成员方法。同一个类的对象都有自己的成员变量,但是共享成员方法,并非每创建一个对象都复制一次方法。
常量池:jvm为每一个类的实例对象维护一个常量池,这个常量池就是这个类型用到的常量的有序集合。
如图:
二、一个java程序的内存分析
源程序:
public class Test {
public static void main(String[] args) {
Test test = new Test();// 1
int date = 10;// 2
BirthDate d1 = new BirthDate(1,10,2012);// 3
BirthDate d2 = new BirthDate(10,12,2014);// 4
test.change1(date);// 5
test.change2(d1);// 6
test.change3(d2);// 7
}
public void change1(int i) {
i = 123;
}
public void change2(BirthDate b) {
b = new BirthDate(13, 12, 2010);
}
public void change3(BirthDate b) {
b.setDay(13);
}
}
class BirthDate {
private int year;
private int month;
private int day;
public BirthDate(int day,int month,int year) {
this.year = year;
this.month = month;
this.day = day;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
this.month = month;
}
public int getDay() {
return day;
}
public void setDay(int day) {
this.day = day;
}
}
1、执行到第4句后,内存分配情况如下:
2、执行chage1的内存情况:
3、执行change2的内存情况:
4、执行change3内存情况: