你被普遍使用的“垃圾收集器”这个术语误导了,这是一个错误的名称。 “垃圾收集器”不会收集垃圾。
因此你的问题起始点是错误的:
让我们假设垃圾收集器已经识别了一个类的实例(一个对象) - 它没有被Java程序使用。 因此,垃圾收集器决定消除该对象,因为它在代码中没有被使用。
这两件事都不会发生。 垃圾收集器不会识别单个未使用的对象,也不会“销毁”任何对象,因为对象的销毁并不是一件事情。
垃圾收集器通过确定仍在使用哪些对象来工作,通常是通过遍历所有对象引用,从根集开始,即仍在运行的线程的本地变量和由引导加载程序加载的类的静态字段。
当它知道哪些对象仍在使用时,这些对象之间的空隙就是可回收的内存,无论以前存储了多少对象。 它可能只是将这些内存块添加到可用内存列表中,但大多数现代垃圾收集器将重新定位仍在使用的对象,以获得连续的空闲内存块,以便进行快速分配并防止碎片化。
所以:
那么“收集”对象会发生什么?
收集的对象什么也不会发生。 死亡对象对该过程完全没有影响。
这些过程在Java或计算机科学术语中的名称是什么?
一般术语仍然是“垃圾收集”,即使其字面意义不描述实际过程。 有时它被称为“内存管理”,这更适合,因为通常情况下,内存管理器还负责分配并确定堆是如何组织的。
在典型的实现中,您可以将子任务标识为
标记(跟踪) - 识别仍在使用的对象的过程。
清扫 - 浏览差距,将它们添加到空闲内存列表中或准备它们进行以下之一的处理:
复制 - 将特定内存区域中的存活对象重新定位到新区域,以便源区域在此后完全空闲。
紧缩 - 在相同的内存区域内移动某些存活对象,填充间隙,以便该区域在开头或结尾具有连续的空闲内存。