list.add('A');
list.add('B');
list=new ArrayList(); //第2次new
list.add('C');
list.add('D');
想请问一下第1次new ArrayList()时的对象和内存会是怎样的? 能不能被回收啊?
8 个解决方案
#1
#2
可以,假设为计数引用的GC
生成list对象,
生成string对象A
将list对象中array引到符号表A上
。。
。。
当释放list时list引用记数为0,回收
A,,为0回收
生成list对象,
生成string对象A
将list对象中array引到符号表A上
。。
。。
当释放list时list引用记数为0,回收
A,,为0回收
#3
第一次创建的list包含有'A'、'B'两个元素啊,这个list没有被清空啊, 它的内存能够被回收吗?
#4
能的。因为第一次的list和“A”和“B”都没有其他引用了。
#5
如果是这样, 没有没有清空的list和它包含的对象能被回收的话, 那list的 clear() 方法没什么特别意义了吧.
#6
list=new ArrayList(); //第1次new
list.add('A');
list.add('B');
list=new ArrayList(); //第2次new
第一次被清空,是因为你第2次又new了ArrayList
其实你如果为了减少内存分配,可以这样
list=new ArrayList(); //第1次new
list.add('A');
list.add('B');
list.clear() ;
list.add('C');
list.add('D');
#7
用clear()方法的时候list的对象句柄的栈地址是不会变的
list=new ArrayList(); //第2次new
list的对象句柄的栈地址是变的
list=new ArrayList(); //第2次new
list的对象句柄的栈地址是变的
#8
这样两次new ArrayList(),是不是会开辟两块地址空间呢? 我想确认的是如果第一次的list对象包含有未清除的元
素,gc能把这个list和里面的元素全部回收掉吗? 我感觉是这个list和"A"以及"B"有包含或者引用关系啊.
素,gc能把这个list和里面的元素全部回收掉吗? 我感觉是这个list和"A"以及"B"有包含或者引用关系啊.
#1
#2
可以,假设为计数引用的GC
生成list对象,
生成string对象A
将list对象中array引到符号表A上
。。
。。
当释放list时list引用记数为0,回收
A,,为0回收
生成list对象,
生成string对象A
将list对象中array引到符号表A上
。。
。。
当释放list时list引用记数为0,回收
A,,为0回收
#3
第一次创建的list包含有'A'、'B'两个元素啊,这个list没有被清空啊, 它的内存能够被回收吗?
#4
能的。因为第一次的list和“A”和“B”都没有其他引用了。
#5
如果是这样, 没有没有清空的list和它包含的对象能被回收的话, 那list的 clear() 方法没什么特别意义了吧.
#6
list=new ArrayList(); //第1次new
list.add('A');
list.add('B');
list=new ArrayList(); //第2次new
第一次被清空,是因为你第2次又new了ArrayList
其实你如果为了减少内存分配,可以这样
list=new ArrayList(); //第1次new
list.add('A');
list.add('B');
list.clear() ;
list.add('C');
list.add('D');
#7
用clear()方法的时候list的对象句柄的栈地址是不会变的
list=new ArrayList(); //第2次new
list的对象句柄的栈地址是变的
list=new ArrayList(); //第2次new
list的对象句柄的栈地址是变的
#8
这样两次new ArrayList(),是不是会开辟两块地址空间呢? 我想确认的是如果第一次的list对象包含有未清除的元
素,gc能把这个list和里面的元素全部回收掉吗? 我感觉是这个list和"A"以及"B"有包含或者引用关系啊.
素,gc能把这个list和里面的元素全部回收掉吗? 我感觉是这个list和"A"以及"B"有包含或者引用关系啊.