Java |垃圾收集器如何忽略没有引用的数组内存

时间:2016-04-24 05:35:12

标签: java arrays memory-management garbage-collection

我的理解是垃圾收集器收集未引用的内存,并且数组引用(例如int [] a = new int [5])仅指向第一个元素(如果这不正确,请告诉我。)

垃圾收集器如何知道不收集和释放分配给第二个元素的内存位置?

1 个答案:

答案 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不会标记它们。