在javaweb方向有经验的前辈们,向你们请教一个问题,很迷惑~

上帝爱众生 发布于 2015/03/19 20:49
阅读 218
收藏 0

假如现在有一个类Student,我们都知道Student s=new Student()这段代码相当于在内存中开辟了一块空间用来存放一个Student类的引用s(即为Student对象),那么我现在想问一下,假如通过访问Dao层把数据库中所有的Student都取出来:

List<Student> list=......

for(int i=0;i<list.size;i++){

Student studentObj=list.get(i);

}

就以上情形来讲studentObj是不断变化的,那么内存中的情况是怎样的?比如说,第一次循环的时候,studentObj的值是list.get(0);第二次就变成了list.get(1),以此类推,最后studentObj的值一定是list.get(i),那么之前取出的对象(像list.get(0);list.get(1);等等)还占用内存吗?jvm的垃圾回收器会不会把他们回收掉?

加载中
0
zpassion
zpassion
如果之前的对象后面没有使用,jvm会自动回收的
0
l
loverCWS
建议 不要在循环里面生成对象  
0
l
loverCWS

建议 不要在循环里面生成对象  你可以

 Student s=null;

for(int i=0;i<list.size;i++){

s=list.get(i);

}

这样 减少 堆分类内存


0
首席撸出血
首席撸出血

引用来自“zpassion”的评论

如果之前的对象后面没有使用,jvm会自动回收的
你确定?循环体里创建新的对象,内存不会被回收,遛狗原理,别误导新人
首席撸出血
首席撸出血
回复 @来自爪哇岛的程序猿 : 这个涉及到内存回收机制了!
上帝爱众生
上帝爱众生
这样堆内存就会有很多的垃圾对象了吧?可是这些对象不是没有用了吗?jvm为什么不回收啊?
0
削你
削你
for循环里面的Student studentObj是说声明了一个Student类型的对象指针,该指针的内存分辟在栈上,只要作用域不在了该指针自然就出栈没有了。关于里面的对象是在堆上分配的,一开始被list<student>持有,后来经过赋值只是两个指针同时指向了同一对象而已。就算for循环结束了,还有list<student>持有该对象的引用,并不会被回收。直到没有指针持有该对象的引用,才会被回收。
削你
削你
回复 @来自爪哇岛的程序猿 : 每new一次对象就在堆上申请一块内存,当没有指针指向它时,java虚拟机会回收它。在哪声明更合适要根据业务情况来。
上帝爱众生
上帝爱众生
我想知道在for循环里new对象和在for循环外new对象哪一个更节省内存啊?
返回顶部
顶部