【发布时间】:2010-11-14 19:32:20
【问题描述】:
我很想知道最新的 JVM 将如何处理由以下方法保留的垃圾收集内存。
public List<Player> getHallOfFame() {
ArrayList<Player> listToSort = new ArrayList<Player>(map.values());
Collections.sort(listToSort, comparator);
return listToSort.subList(0, 5);
}
在最坏的情况下,我可以想象 JVM 将 listToSort 的全部内容保留在内存中,只要仍然存在对子列表的引用。有谁知道事实是否如此?我对可以为特定 JVM 证明一种或另一种方式的链接特别感兴趣。
【问题讨论】:
-
我认为 .subList 返回一个新列表,而 listToSort 将超出范围,因此会被垃圾收集。
-
@Paul:文档另有说明。
-
是的,这里的关键是它由原始列表支持,因此原始列表中的任何更改都会反映在子列表中。
-
另见 openJDK 中的实现。 docjar.com/html/api/java/util/AbstractList.java.html
-
好吧,@Jon,我总是说,当你要做出不知情的猜测时,你(意思是我)应该在评论而不是答案中进行。 :-)