代码之家  ›  专栏  ›  技术社区  ›  alsaleem

列表添加/添加所有浅复制和gc

  •  0
  • alsaleem  · 技术社区  · 8 年前

    我有 ClassA ,请 ClassB 还有一根线 B . A级 会问的 B类 从数据库服务器收集数据。这样做之后, A级 将从中复制数据 B类 使用 List.add . 我明白 A级 元素是 B类 (仅复制引用)。

    复制后, B类 将超出范围,GC可以处理它。

    1. GC会处理吗 B类 甚至在中创建的对象 B类 仍被引用 A级 是吗?

    2. 或保持 B类 在记忆中?

    3. 或者只保留被其他类引用的对象,并释放未使用的对象。

    1 回复  |  直到 8 年前
        1
  •  0
  •   Speakjava    8 年前

    垃圾收集器处理对对象的引用,它的分析将定位代码维护对其引用的所有对象。

    回答你的三个问题:

    1. 如果您的代码仍然引用ClassA,那么它引用的任何对象(无论是哪个类创建的)都不会被收集。
    2. ClassB超出了范围,这意味着代码不再引用它。因此,它是合格的托收。当这种情况发生时,没有定义。
    3. 这个问题并不完全清楚。收集器将收集任何未被引用(直接或间接)的对象。

    提供更多的背景来帮助你理解这一点。当公共GCS(有些可能不这样做)启动时,它们会创建一个称为根集的对象。这是从代码中直接访问的所有对象的列表。这是通过扫描所有初始化的类(对于静态引用)以及寄存器和堆栈来创建的。对于CMS和G1,此根集用于执行初始标记阶段(与应用程序线程同时执行)。收集器将获取根集中的每个对象引用,并遍历根集中的所有对象引用,以建立可从代码访问的对象的完整列表。如果无法访问某个对象,则不会标记该对象。一旦标记完成(对于CMS和G1,这也需要一个停止世界标记阶段),收集器就有一个可访问对象的精确列表。

    对于年轻一代集合,有效对象被复制到幸存者空间或提升到旧一代。旧的gen集合要么更新活动对象之间的可用空间列表,要么执行完全压缩集合,重新定位对象以使它们在内存中都是连续的,从而消除碎片。

    还有其他一些算法做的事情略有不同(比如我为之工作的阿祖尔的C4),但总体效果是相同的。