我目前正在优化我的应用程序,并且我注意到它占用了近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。简而言之,像这样创建大量的大型数组很不理想,原因很多。 –