我的理解是垃圾收集器收集未引用的内存,并且数组引用(例如int [] a = new int [5])仅指向第一个元素(如果这不正确,请告诉我。)
垃圾收集器如何知道不收集和释放分配给第二个元素的内存位置?
答案 0 :(得分:7)
数组引用(例如int [] a = new int [5])仅指向第一个元素
这是不正确的 1 。
数组引用指向具有特殊length
字段的Java对象,该字段(在本例中)包含值5
。 GC知道如何找到该字段,并知道它意味着什么。
在这种情况下,int[]
不能包含任何引用,因此GC只需在重定位数组时复制数组内容。如果这是Integer[]
,则数组可以包含引用,GC将(如果需要 2 )标记并重新定位它们。
1 - 对于C和C ++来说是正确的,但那些是不同的编程语言。您无法根据C或C ++的心智模型正确推断Java GC的工作原理。
2 - 这取决于正在执行的收集类型。如果GC正在收集" new"空间和引用是旧空间中的对象,然后GC不会标记它们。