黑马程序员技术交流社区

标题: 内存中栈和堆问题 [打印本页]

作者: 吴文华    时间: 2012-2-17 15:46
标题: 内存中栈和堆问题
本帖最后由 吴文华 于 2012-2-18 14:10 编辑

这是看毕老师视频做的笔记
内存问题:
栈:数据使用完毕,会自动释放
堆:内存地制值,默认初始化值,垃圾回收机制

假设定义了一个数组:int [] arr=new int[3];
在栈内存中就有分配了一个arr,而在堆内存中就分配了一片空间存储数组。

arr不是数组吗?为什么存放在栈内存中呢?垃圾回收机制又是怎么回事呢?

我是初学者,问题可能有点描述不清楚,也有点低级,希望大家回答的详细点。
作者: 邱纲    时间: 2012-2-17 16:00
这时arr就不能把它简简单单的看作一个int类型的基本数据,而是一个数组类型的对象,所以内容会存放在堆内存中,当这个程序对它的调用完毕之后,jvm的回收机制就回回收其占用的内存。
作者: 彭嘉聪    时间: 2012-2-17 16:01
jvm的东西很多,很多全部说齐,不过你只要记住new出来的东西都会在堆里面就好了
数组你学到反射或者泛型就会知道其实也是一个对象来的。
垃圾回收机制是,有些对象已经没有了引用,但是还存在堆中
jvm就会产生一系列的动作对他们进行回收并释放空间,因为他们不会像栈那样出栈释放的
作者: 朱辉    时间: 2012-2-17 16:08
int [] arr=new int[3];  在栈内存中有一个arr,堆里面分配了一片空间,有arr[0],arr[1],arr[2]三个元素,arr就指向在堆里面分配的这片空间。JVM中有一个垃圾回收器当某对象不再被任何变量引用时,其内存才可能被回收;回收之前会调用finalize()方法,该方法有可能取消回收操作。
作者: 黄锦成    时间: 2012-2-17 16:29
变量arr是放在栈中的,new int[3]是放在堆中的。arr指向了堆中的new int[3]
作者: 陈伟    时间: 2012-2-17 21:20
arr是一个变量,是一个指向数组对象的应用变量,所以放在栈内存中,当这个引用变量没有用的时候,就会自动释放,而堆内存中的对象因为没有引用指向它,就会被JVM当做垃圾清除掉
作者: 黄奇耀    时间: 2012-2-18 08:06
地址对象一般都存放在栈中,堆相当存放实物数据。arr是一个地址,它存放在栈里面,且有一个指针指向堆里面的in[0]。
作者: 唐林渊    时间: 2012-2-18 08:51


1arr不是数组吗?

第一个问题,是

第二个问题
为什么存放在栈内存中呢?
栈内存中存放的只是arr的地址,堆内存中才是存放的是数组的元素
当new的时候它也在堆内存中开辟了空间,把元素存放到堆内存中,元素的地址就是存放在arr里面的。
第三个问题
垃圾回收机制又是怎么回事呢?
这个数组等于null的时候,这个地址就没有谁来指向了,这样来说 你往垃圾箱里放点垃圾,清洁员不会说马上倒掉
,这是需要时间的。等垃圾满了,他就会来倒掉。这样能理解吗?







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2