J2SE - 内存解析

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

 

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

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

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

 

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

 

这是主函数:

 

[java] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. public static void main(string args[]){  
  2.     Test test = new Test();  
  3.     int date = 9 ;  
  4.     Birthday b1 = new Birthday( 7, 7, 1970);  
  5.            Birthday b2 = new Birthday( 1, 1, 2000);  
  6.     test.Change1(date);  
  7.     test.Change2(b1);  
  8.     test.Change3(b2);  
  9.       
  10.   }  


 

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

 

 

调用方法Change1


 

[java] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. public void Change1( int i)  
  2.   {  
  3.     i = 1234 ;  
  4.   }  

 

 

没有走方法体时:

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

 

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

 


 

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


 

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

 

 

调用方法Change2

[java] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. public void Change2(BirthDate b)  
  2. {  
  3.     b = new BirthDate(22,2,2016);     
  4. }  

 

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

 

当执行方法体

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

 

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

改变成

 

 


 


 

 

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

 


 

调用方法Change3()

[java] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. <strong><span style="font-family:KaiTi_GB2312;font-size:24px;">public void Change3(BirthDate b)  
  2.     {  
  3.         b.SetDay(9);      
  4.     }  
  5. </span></strong>  

 

 

 

SetDay()BirthDate()里的方法

[java] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. <strong><span style="font-family:KaiTi_GB2312;font-size:24px;">Public void SetDay(int d)  
  2. {  
  3.     day = d;  
  4. }  
  5. </span></strong>  


 

执行方法体



 

执行方法体后日期被改变




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

posted @ 2017-01-15 19:05  天涯海角路  阅读(92)  评论(0)    收藏  举报