2011-08-18 55 views
1

我很好奇这件事在Android内部是如何工作的。我有两个列表类<>内,在运行时实例化,并装载在阅读一些数据创建的对象,我想知道这些名单在这种情况下发生的:Android垃圾回收器,释放对象内的对象

  1. A类具有列表B和列表C与其他许多初始化对象 里面。

  2. 另一个不同的类从类别A的 方法获得参考列表C,如public List<myObject> GetList()

  3. 在代码的某处,不再使用A类,并且应用程序 向垃圾收集器发出信号,将对象设置为空。

我的列表C被其他对象引用会发生什么?对象类A会发生什么?

我试图跟踪垃圾收集器与Logcat运行apk在调试器中一步一步但没有运气。有时它释放记忆,有时不会,我无法确定任何特定的行为。

回答

3

如果有任何对象,仍然有一个通向根的路径,包含对另一个对象的引用,那么所引用的对象将不会被垃圾收集。所以如果你创建的对象A有一个子对象A1。然后创建对象B,并通过什么方式将对A1的引用传递给对象B.即使对象A是GC'd,A1也不会因为对象B仍保存引用。 (在你的榜样,A & B将被gc'd。C不会)

通过明确告诉系统在特定的时间与System.gc();呼叫来执行收集垃圾回收背后的力学实验。你也可以覆盖最后确定对象,看给定对象收集的确切时间:

@Override 
    protected void finalize() throws Throwable { 
     try { 
     Log.d("Learning about GC", "My Object has been GC'd." + this);   
     } finally { 
     super.finalize(); 
     } 
    } 

您可以通过使用对象,引用实验学到很多东西,最终确定和GC显式调用()。完成测试后,我会删除重写的最终确认电话。

+0

虽然小精灵的答案也是正确的,但我倾向于选择格雷格的这样一个伟大的建议,真的很值得。我刚刚发现如何正确处理我的物体以提高性能,非常感谢! – ruhalde

+0

@ruhalde:我希望你不会使用finalization来提高性能,因为它只会降低性能。这里有一篇关于GC的好文章:http://java.sun.com/docs/books/performance/1st_edition/html/JPAppGC.fm.html。 – Michael

+0

我从来没有建议使用finalize除了学习工具以外的其他任何东西。它绝对不是执行任何清理或所需功能的地方,但可以成为学习GC如何工作的好方法。正如我在原始文章中提到的,我还建议您在完成实验/测试时删除最终确认电话。 –

3

A级的对象将在下一个GC循环期间被垃圾收集。列表B也将被GC'ed。并且列表C将不会GC'ed,因为它可以从GC根目录获得。

-1

默认情况下,java通过引用而不是按值创建对象。所以,在这种情况下,如果垃圾收集器将拾取并清空所有A B C,然后另一个引用C的类将是空的,因为它没有创建类的重复,它只是引用它。