我非常好奇这个东西在Android中如何运作。我有一个有两个List<>的课程在内部,在运行时实例化并加载了在读取一些数据时创建的对象,我想知道在这种情况下这些列表会发生什么:
A类具有List B和List C以及许多其他初始化对象 内部。
另一个不同的类从a获取List C的引用
A类方法,如public List<myObject> GetList()
。
代码中的某处,不再使用A类和应用程序 向垃圾收集器发出信号,将对象设置为null。
我的List C被其他对象引用会发生什么?对象类A会发生什么?
我试图跟踪垃圾收集器,Logcat在调试器中逐步运行apk,但根本没有运气。有时它会释放记忆,有时候不会,我无法确定任何特定的行为。
答案 0 :(得分:3)
在下一个GC循环期间,将对A类的对象进行垃圾回收。列表B也将是GC。并且列表C将不会被GC,因为它可以从GC根源到达。
答案 1 :(得分:3)
如果有任何对象,仍然有一个root的路径,包含对另一个对象的引用,则不会对引用的对象进行垃圾回收。因此,如果创建对象A,则具有子对象A1。然后创建对象B并通过任何方式将对A1的引用传递给对象B.即使对象A是GC,A1也不会是因为对象B仍然保持引用。 (在你的例子中,A&amp; B将是gc'd ... C不会)
您可以通过System.gc();
调用明确告知系统在特定时间执行集合,来体验垃圾收集背后的机制。您还可以覆盖对象中的finalize,以准确查看收集给定对象的时间。:
@Override
protected void finalize() throws Throwable {
try {
Log.d("Learning about GC", "My Object has been GC'd." + this);
} finally {
super.finalize();
}
}
通过试验gc()的对象,引用,最终化和显式调用,您可以学到很多东西。完成测试后,我会删除被覆盖的终结调用。
答案 2 :(得分:-1)
默认情况下,java通过引用而不是按值创建对象。因此,在这种情况下,如果垃圾收集器将拾取并清空所有A B C,那么引用C的另一个类将为空,因为它没有创建类的重复,它只是引用它。