A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 吴文华 黑马帝   /  2012-2-17 15:46  /  2270 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 吴文华 于 2012-2-18 14:10 编辑

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

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

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

我是初学者,问题可能有点描述不清楚,也有点低级,希望大家回答的详细点。

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

7 个回复

倒序浏览
这时arr就不能把它简简单单的看作一个int类型的基本数据,而是一个数组类型的对象,所以内容会存放在堆内存中,当这个程序对它的调用完毕之后,jvm的回收机制就回回收其占用的内存。

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

回复 使用道具 举报
jvm的东西很多,很多全部说齐,不过你只要记住new出来的东西都会在堆里面就好了
数组你学到反射或者泛型就会知道其实也是一个对象来的。
垃圾回收机制是,有些对象已经没有了引用,但是还存在堆中
jvm就会产生一系列的动作对他们进行回收并释放空间,因为他们不会像栈那样出栈释放的

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

回复 使用道具 举报
int [] arr=new int[3];  在栈内存中有一个arr,堆里面分配了一片空间,有arr[0],arr[1],arr[2]三个元素,arr就指向在堆里面分配的这片空间。JVM中有一个垃圾回收器当某对象不再被任何变量引用时,其内存才可能被回收;回收之前会调用finalize()方法,该方法有可能取消回收操作。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
变量arr是放在栈中的,new int[3]是放在堆中的。arr指向了堆中的new int[3]
回复 使用道具 举报
arr是一个变量,是一个指向数组对象的应用变量,所以放在栈内存中,当这个引用变量没有用的时候,就会自动释放,而堆内存中的对象因为没有引用指向它,就会被JVM当做垃圾清除掉
回复 使用道具 举报
地址对象一般都存放在栈中,堆相当存放实物数据。arr是一个地址,它存放在栈里面,且有一个指针指向堆里面的in[0]。
回复 使用道具 举报
唐林渊 黑马帝 2012-2-18 08:51:11
8#


1arr不是数组吗?

第一个问题,是

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


评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马