J2SE - 内存解析

来源:互联网 发布:国内主机推荐 知乎 编辑:程序博客网 时间:2024/06/05 14:53

先声明几个内存分析的小规则:

1.局部变量,基础类型的,只占一块内存

2.形参等同于局部变量,在栈内存中分配空间,值为实参传的值

3.方法执行完后,为此方法分配的所有局部变量的内存空间消失,在堆内存中对应的内存不一定马上消失,垃圾收集器回收时就消失了


下面我用例子来解释这几个规则


这是主函数:

public static void main(string args[]){Test test = new Test();int date = 9 ;Birthday b1 = new Birthday( 7, 7, 1970);           Birthday b2 = new Birthday( 1, 1, 2000);test.Change1(date);test.Change2(b1);test.Change3(b2);  }

没有调用方法之前,内存分配是这样的:


 

调用方法Change1


public void Change1( int i)  {  i = 1234 ;  }

没有走方法体时:

i是形参,形参等同于局部变量,i的值应为实参date的值,内存分配是这样的


运行到方法体i = 1234 ;  i的值被改变,但date的值是不会被改变的



方法被运行完后,Change1方法分配的内存空间 i消失,内存恢复为:


Change1()方法中什么都没有改变,此方法相当于没有调。

 

 

调用方法Change2

public void Change2(BirthDate b){b = new BirthDate(22,2,2016);}


b为局部变量,BirthDate的引用类型b是形参,所以b的地址和实参b1的地址是一样,他们都可以指向同一个值



当执行方法体

b = newBirthDate(22,2,2016);        bnew出来一个新的对象,堆内存里为b分配内存空间


执行完方法Change2()后,局部变量b消失,此方法并没有改变b1。此方法不能把

改变成





b虽然消失了,但堆内存中为b创建的内存不一定会马上消失,等垃圾收集器回收的时候,他就消失了,


调用方法Change3()

public void Change3(BirthDate b){b.SetDay(9);}



SetDay()BirthDate()里的方法

Public void SetDay(int d){day = d;}


执行方法体



执行方法体后日期被改变




用例子来学习内存解析还是容易理解的,自己敲代码的时候多想想吧。


6 3
原创粉丝点击