0

最近,我将以下代码从for-each 更改为 Iterator(使用iterator.remove()

它立即解决了我的堆空间内存问题。

有人可以解释iterator.remove()真的有帮助吗?

final Iterator<Entry<String, String>> metaTagIterator = localeDO.getMetaTags().entrySet().iterator();

while (metaTagIterator.hasNext()) {
    final Entry<String, String> entry = metaTagIterator.next();

    if (ImportUtil.isI18nLiferayLayoutProperty(entry.getKey())) {
        layoutProps.setProperty(entry.getKey() + StringPool.UNDERLINE + locale, entry.getValue());
    } else if (ImportUtil.isLiferayLayoutProperty(entry.getKey())) {
        layoutProps.setProperty(entry.getKey(), entry.getValue());
    } else {
        myCustomLayoutProps.setProperty(entry.getKey() + StringPool.UNDERLINE + locale, entry.getValue());
    }
    metaTagIterator.remove();
}
4

2 回答 2

0

我唯一能做到的是,当您设置值layoutPropsmyCustomLayoutProps消耗更多内存时,metaTagIterator.remove();释放内存是同时删除元素localeDO.getMetaTags()这样,您可以在迭代期间节省一些内存需求。

于 2012-11-20T15:18:57.547 回答
0

从基础集合中移除迭代器返回的最后一个元素(可选操作)。每次调用 next 时,此方法只能调用一次。如果在迭代过程中以除调用此方法之外的任何方式修改了基础集合,则迭代器的行为是未指定的。

这里没什么特别的。当您迭代和删除时,该对象将从集合中删除,如果它没有活动引用,它将可用于 GC。

于 2012-11-20T15:23:58.033 回答