android垃圾收集器,释放对象内部的对象

时间:2011-08-18 14:14:49

标签: android garbage-collection arraylist

我非常好奇这个东西在Android中如何运作。我有一个有两个List<>的课程在内部,在运行时实例化并加载了在读取一些数据时创建的对象,我想知道在这种情况下这些列表会发生什么:

  1. A类具有List B和List C以及许多其他初始化对象 内部。

  2. 另一个不同的类从a获取List C的引用 A类方法,如public List<myObject> GetList()

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

  4. 我的List C被其他对象引用会发生什么?对象类A会发生什么?

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

3 个答案:

答案 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的另一个类将为空,因为它没有创建类的重复,它只是引用它。