这是我第一次再CSDN上提问,我没有奖励可以给各位大佬,抱歉。
不好意思,我的java并不好,但靠我自己目前的水平确实无法理解java中list的某些“异常现象”,我也无法理解GC的回收机制。
下面是一段异常简单的代码:
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
Random random = new Random();
long s = System.currentTimeMillis();
long e = 0;
while ((e - s) < 10000) {
e = System.currentTimeMillis();
list.clear();
// int = random.nextInt();
for (int i = 0; i < 10000; i++) {
list.add(random.nextInt());
}
}
}
(这只是我遇到的问题的一个简单但描述清除的模拟)
就是这么一段代码,但是这却会消耗无法想象的内存,我在我电脑上测试是达到了 826M的内存消耗。一开始我并没有注意到这个问题,因为我天真的认为我调用了 clear() ,一段时间后GC 自然就会回收 list 的内存。
我研究了很多种不同的类似版本:如分别测试arraylist和linkedlist、List中存储对象(而不是基本数据类型)、循环调用remove清空List、list中存储单个int值(像注释中那样)、list中存储单个对象引用等等
除了最后一种情况,其他任何情况都会消耗巨大的内存。希望能够有大佬能够为我解释这种情况的原因。(实际上我如果频繁调用 System.gc() 是可以回收部分内存的)以及类似需求我该如何应对?