最近,我将以下代码从 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();
}
答案 0 :(得分:0)
我在layoutProps
和myCustomLayoutProps
设置值并消耗更多内存时,我只能这样做,metaTagIterator.remove();
释放内存从{{删除元素1}} 同时。 这样您就可以在迭代过程中节省一些内存需求。
答案 1 :(得分:0)
从底层集合中移除迭代器返回的最后一个元素(可选操作)。每次调用next时,只能调用一次此方法。如果在迭代正在进行的过程中修改基础集合而不是通过调用此方法,则迭代器的行为是未指定的。
这里没什么特别的。当你迭代并删除时,该对象将从集合中删除,如果它没有活动引用,它将可用于GC。