List subList()方法是否阻止了列表其余部分的垃圾收集?

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)

  • @Caoilte:像反思这样的事情使这种分析变得非常困难. (3认同)