我目前正在優化我的應用程序,並且我注意到它佔用了近1G內存。我做了一些分析,發現問題: 我通過在我製作的紋理類中創建保存像素數據的int數組來分配大量內存。 但是這讓我感到困惑,因爲當創建一個新的數組時,舊的數組不再被使用,並且沒有任何地方引用它。Java - 未引用的陣列仍然佔用內存
我已經寫了重新產生此問題的測試程序:
public class Main {
static class ArrayHolder {
int[] array;
void init() {
array = null;
array = new int[4000];
}
}
public static void main(String[] args) {
ArrayHolder holder = new ArrayHolder();
for (int i = 0; i < 1000000; i++) {
holder.init();
}
System.out.println(holder.array.length);
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
當我運行這段代碼的程序使用最多的RAM 600兆字節。我不明白爲什麼,因爲在ArrayHolder中調用init()方法時,數組字段被設置爲新數組,並且舊數組的引用丟失。這並不意味着它不再佔用空間了嗎? 對不起,如果這是一個沒有問題的問題,但有人可以解釋這是爲什麼,我在這裏做錯了什麼?
您的舊陣列只能在gc的判斷下啓動。如果gc在重新分配內存後很快運行,那麼該空間將被回收,否則它不會。 – SMA
大型陣列被添加到終身空間,並且只有填滿時纔會默認進行GC編輯。例如睡眠不會觸發GC。簡而言之,像這樣創建大量的大型數組很不理想,原因很多。 –