dj_*_*rai 0 java arrays garbage-collection memory-management
我的理解是垃圾收集器收集未引用的内存,并且数组引用(例如int [] a = new int [5])仅指向第一个元素(如果这不正确,请告诉我.)
垃圾收集器如何知道不收集和释放分配给第二个元素的内存位置?
数组引用(例如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不会标记它们.