Cao*_*lte 8 java garbage-collection
我很想知道最新的JVM如何处理由以下方法保留的垃圾收集内存.
public List<Player> getHallOfFame() {
ArrayList<Player> listToSort = new ArrayList<Player>(map.values());
Collections.sort(listToSort, comparator);
return listToSort.subList(0, 5);
}
Run Code Online (Sandbox Code Playgroud)
在最坏的情况下,我可以想象listToSort只要存在对子列表的引用,JVM就会保留内存中的全部内容.有谁知道这是否真的如此?我特别感兴趣的是能够证明这种或那种特定JVM的链接.
Jon*_*eet 12
是的,subList只是现有列表的"视图".所有数据都在原始列表中.从文档:
返回的列表由此列表支持,因此返回列表中的非结构更改将反映在此列表中,反之亦然.
所以是的,返回一个子列表将使原始列表不被垃圾收集.
如果您不想要这种效果,您基本上需要复制相关的子列表.例如:
return new ArrayList<Player>(listToSort.subList(0, 5));
Run Code Online (Sandbox Code Playgroud)