Java 堆空间错误-如何优化此代码
我有堆空间错误,代码如下 有人知道如何优化这段代码吗 对于大文件[180MB]会发生这种情况。方法参数有大约50个元标记键值,对应于每个区域设置。该错误在处理4500页后显示 注意:我尝试将foreach更改为迭代器,以使用iterator.remove()释放空间Java 堆空间错误-如何优化此代码,java,memory-management,out-of-memory,heap-memory,Java,Memory Management,Out Of Memory,Heap Memory,我有堆空间错误,代码如下 有人知道如何优化这段代码吗 对于大文件[180MB]会发生这种情况。方法参数有大约50个元标记键值,对应于每个区域设置。该错误在处理4500页后显示 注意:我尝试将foreach更改为迭代器,以使用iterator.remove()释放空间 public static String myChildPropsToString(final UnicodeProperties myLayoutProps) { final StringBuilder sb
public static String myChildPropsToString(final UnicodeProperties myLayoutProps) {
final StringBuilder sb = new StringBuilder(myLayoutProps.size());
final String[] matchTarget = new String[] { StringPool.RETURN_NEW_LINE, StringPool.NEW_LINE, StringPool.RETURN };
final String[] replaceTargetBy = new String[] { "_SAFE_NEWLINE_CHARACTER_", "_SAFE_NEWLINE_CHARACTER_",
"_SAFE_NEWLINE_CHARACTER_" };
//COMMENTED TO TRY OUT ITERATOR.REMOVE
//
// for (final Map.Entry<String, String> entry : myLayoutProps.entrySet()) {
// final String value = entry.getValue();
//
// if (Validator.isNotNull(value)) {
// StringUtil.replace(value, matchTarget, replaceTargetBy);
//
// sb.append(entry.getKey());
// sb.append(StringPool.EQUAL);
// sb.append(value);
// sb.append(StringPool.NEW_LINE);
// }
// }
final Iterator<Entry<String, String>> propsIterator = myLayoutProps.entrySet().iterator();
while (propsIterator.hasNext()) {
final Entry<String, String> entry = propsIterator.next();
if (Validator.isNotNull(entry.getValue())) {
StringUtil.replace(entry.getValue(), matchTarget, replaceTargetBy);
sb.append(entry.getKey());
sb.append(StringPool.EQUAL);
sb.append(entry.getValue());
sb.append(StringPool.NEW_LINE);
}
}
propsIterator.remove();
return sb.toString();
}
任何帮助都将不胜感激 尝试放置支撑器。移除();在这段时间内
final Iterator<Entry<String, String>> propsIterator = myLayoutProps.entrySet().iterator();
while (propsIterator.hasNext()) {
final Entry<String, String> entry = propsIterator.next();
if (Validator.isNotNull(entry.getValue())) {
StringUtil.replace(entry.getValue(), matchTarget, replaceTargetBy);
sb.append(entry.getKey());
sb.append(StringPool.EQUAL);
sb.append(entry.getValue());
sb.append(StringPool.NEW_LINE);
}
propsIterator.remove();
}
final Iterator propsIterator=mylayopps.entrySet().Iterator();
while(propsIterator.hasNext()){
最终条目=propsIterator.next();
if(Validator.isNotNull(entry.getValue())){
StringUtil.replace(entry.getValue(),matchTarget,replaceTargetBy);
sb.append(entry.getKey());
sb.append(StringPool.EQUAL);
sb.append(entry.getValue());
sb.追加(StringPool.新行);
}
propsIterator.remove();
}
为什么不给JVM更多的堆空间-Xmx
我已经试过了。但是这段代码占用了内存,我觉得我们可以对代码本身做些什么。你调用while循环之外的propsIterator.remove()
有什么原因吗?我从来没有想过。谢谢我会试试的!你知道到底是什么东西在吞噬你的记忆吗?我从没想过。谢谢我会试试的。谢谢,但这似乎也没用。我甚至尝试过增加StringBundler的初始大小(以避免以后扩展),但问题仍然存在。我在foreach上实现了相同的迭代器逻辑来填充这些道具,现在速度更快了!谢谢你的帮助!
final Iterator<Entry<String, String>> propsIterator = myLayoutProps.entrySet().iterator();
while (propsIterator.hasNext()) {
final Entry<String, String> entry = propsIterator.next();
if (Validator.isNotNull(entry.getValue())) {
StringUtil.replace(entry.getValue(), matchTarget, replaceTargetBy);
sb.append(entry.getKey());
sb.append(StringPool.EQUAL);
sb.append(entry.getValue());
sb.append(StringPool.NEW_LINE);
}
propsIterator.remove();
}