Java把内存分为栈内存和堆内存。两者的主要区别是:
| 栈内存 | 堆内存 |
存放内容 | (1)在函数中定义的基本类型变量 (2)在函数中定义的对象的引用变量 |
new产生的对象和数组 |
回收方式 | 自动回收:在函数体(即在{}之内)中定义的变量,如果超过了函数体,将自动回收。 |
由垃圾回收器回收。 |
栈内存,堆内存和垃圾回收器的关系:
在堆中分配内存给新产生对象或者数组的同时,还在栈中产生一个特殊变量,这个特殊变量的取值等于对象或者数组在堆内存中的首地址。当这个特殊变量超过了函数体{},被自动回收后,那么在堆中分配的那块儿内存就变成了垃圾。这个时候就可以启动垃圾回收器进行回收了。
例如,说出Strings =newString("xyz")的内存分配形式?
答案:在堆内存开辟为对象"xyz"开辟内存,在栈内存创建引用变量s,指向对象"xyz"。
感谢金丝燕大学校长