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

dj_*_*rai 0 java arrays garbage-collection memory-management

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

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

Ste*_*n C 7

数组引用(例如int [] a = new int [5])仅指向第一个元素

这是不正确的1.

数组引用指向一个Java对象,该对象具有一个特殊length字段(在本例中)将包含该值5.GC知道如何找到该字段,并知道它的含义.

在这种情况下,int[]不能包含任何引用,因此GC只需要在重定位数组时复制数组内容.如果这是一个Integer[],那么数组可以包含引用,并且GC将(如果需要2)标记并重新定位它们.


1 - 对C和C++来说是正确的,但那些是不同的编程语言.您无法根据C或C++的心智模型正确推断Java GC的工作原理.

2 - 这取决于正在执行的收集类型.如果GC仅收集"新"空间并且引用是旧空间中的对象,则GC不会标记它们.