当我运行以下程序时:
public static void main(String[] args) {
ArrayList<Object> lists = new ArrayList<>();
for (int i = 0; i <200000 ; i++) {
lists.add(new Object());
}
System.gc();
try {
Thread.sleep(Integer.MAX_VALUE);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
我会转储堆
jmap -dump:live,format=b,file=heap.bin 27648
jhat -J-Xmx2G heap.bin
ArrayList
和 200000 个对象丢失了。
我不知道为什么 JVM 知道这些对象将不会被使用,也不知道为什么 JVM 判断这个 GC 根不是一个引用。
<n
时,您将执行n
次迭代,因此在每次迭代中创建一个对象时创建n
个对象。这是标准的for
循环习惯用法,在C
,Java
和许多其他语言中使用。不要建议在此处使用<=
,因为那样会多进行一次迭代。 - Holger