您的位置:首页 > 编程语言 > Java开发

java内存分配详解

2013-08-25 16:42 316 查看






分析上面的代码执行过程中内存分配

1、首先找到main(),开始执行。当从34执行到36行时,内存分配如图(1):



                                                     图(1)

2,当执行完36行时,参数d,m,y就不存在了。

3,执行完37行后,内存分配如下图(2):



                                                               图(2)

4、执行38行 test.change1(date);时,首先为参数i分配一个栈空间,并且把date的值复制给i,函数所做的操作是将1234赋值给i,所以存储在栈空间中的i的值由9变成了1234.但是执行完这句话后,参数就不存在了,也就是i就没有了,i所占的栈空间会被回收(但可能并不是立即回收,但意味着这个本来存放i的地方就可以存放其他东西了)。所以执行这句话完成后,并没有产生任何效果,与没有执行是一样的。

5、执行39行:test.change2(d1); 首先为参数b分配一个栈空间,并且b指向的与d1指向的内容是一样的。然后在函数体中新new了一个对象(2004,2,22),这个新new的对象存在堆中,并且b改变指向,现在指向了这个新new的对象。但是当这句话执行完毕后,栈中的b消失了,同样b到对象(2004,2,22)的指针也消失了,那么(2004,2,22)就不再有指针指向它了。在垃圾回收时,就会把它回收了。

6、执行40行test.change3(d2);首先为参数b分配一个栈空间,并且b指向和d2指向是一样的。然后在函数体中调用setDay(22),修改了day的值,那么day就从1变成了22,这时候才真正的保留了修改的内容产生了影响。当这句执行完后,b就消失了,但这句所做的修改保留了下来。

7、整个main()函数执行完后,test、 date、 d1 、d2就都不存在了,而原本在堆中的内容将被当做垃圾回收。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  内存分配 java 指针