Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 堆空间错误-如何优化此代码_Java_Memory Management_Out Of Memory_Heap Memory - Fatal编程技术网

Java 堆空间错误-如何优化此代码

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

我有堆空间错误,代码如下

有人知道如何优化这段代码吗

对于大文件[180MB]会发生这种情况。方法参数有大约50个元标记键值,对应于每个区域设置。该错误在处理4500页后显示

注意:我尝试将foreach更改为迭代器,以使用iterator.remove()释放空间

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();
    }