java - 内存不足错误 : Java Heap space

标签 java out-of-memory mappedbytebuffer

我正在尝试使用映射字节缓冲区读取文件,但在 buffer.position(position); 行收到 OutOfMemoryError:JavaHeapSpace 消息。我不知道不明白代码中有什么问题。错误的原因可能是什么?

private void readFile()
{
    int lastPos = buffer.getInt();

    int dirLen = buffer.getInt();
    byte[] dirBytes = new byte[dirLen];
    buffer.get(dirBytes);
    this.dir = new String(dirBytes);

    int filePatternLen = buffer.getInt();
    byte[] filePatternBytes = new byte[filePatternLen];
    buffer.get(filePatternBytes);
    this.filePattern = new String(filePatternBytes);

    int numFileMetaDatas = 0;
    while (buffer.position() < lastPos)
    {
        numFileMetaDatas++;
        int position = buffer.position();
        //Size is needed as we are reserving some extra bytes
        int size = buffer.getInt();
        buffer.position(position + ByteUtil.SIZE_OF_INT + ByteUtil.SIZE_OF_BYTE + ByteUtil.SIZE_OF_LONG + ByteUtil.SIZE_OF_LONG + ByteUtil.SIZE_OF_LONG);
        int fileNameLen = buffer.getInt();
        byte[] fileNameBytes = new byte[fileNameLen];
        buffer.get(fileNameBytes);

        FileMetaData fileMetaData = new FileMetaData(buffer, size, position);
        UniqueID uniqID = fileMetaData.getUniqueID();

        uniqIdVsFileMetaData.put(uniqID, fileMetaData);

        position = position + size;
        buffer.position(position);
    }
    nextMetaStartPos = lastPos;
}

最佳答案

解决java中OutOfMemoryError的简单方法是使用JVM选项“-Xmx512M”增加最大堆大小,这将立即解决OutOfMemoryError。当我在构建项目时在 Eclipse、Maven 或 ANT 中遇到 OutOfMemoryError 时,这是我的首选解决方案,因为根据项目的大小,您很容易耗尽内存。这里是增加 JVM 最大堆大小的示例,而且最好保留 -如果您在 Java 应用程序中设置堆大小,则 Xmx 与 -Xms 的比例为 1:1 或 1:1.5

导出 JVM_ARGS="-Xms1024m -Xmx1024m"

2) 解决 Java 中的 OutOfMemoryError 的第二种方法相当困难,当您没有太多内存时,即使增加最大堆大小,您仍然会遇到 java.lang.OutOfMemoryError,在这种情况下,您可能需要分析您的应用程序并查找任何内存泄漏。您可以使用 Eclipse Memory Analyzer 来检查堆转储,也可以使用任何分析器(例如 Netbeans 或 JProbe)。这是一个艰难的解决方案,需要一些时间来分析和查找内存泄漏。

    -vm
C:/Program Files (x86)/Java/jdk1.6.0/bin/javaw.exe
-startup
plugins/org.eclipse.equinox.launcher_1.2.0.v20110502.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.1.100.v20110502
-product
com.springsource.sts.ide
--launcher.defaultAction
openFile
--launcher.XXMaxPermSize
384M//incease to 512 mb
-vmargs
-Dosgi.requiredJavaVersion=1.5
-Xmn128m
-Xms256m
-Xmx768m
-Xss1m
-XX:PermSize=128m// increase to 512 mb 
-XX:MaxPermSize=384m//increase to 512 mb

关于java - 内存不足错误 : Java Heap space,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28234866/

相关文章:

连续更改 map 大小时,Java MappedByteBuffer 性能越来越差

java - 在linux机器上编译java相对于windows有什么好处?

java - Eclipse (C++) 崩溃无法写入核心转储。核心转储已被禁用

java - 即使没有内存不足,我也会遇到 java.lang.OutOfMemoryError 吗?

java - 有没有办法在同一台服务器上运行两个JVM?

awk 关联数组增长很快

java - mappingsize 或 limit 如何影响 MappedByteBuffer 性能?

java - 使 BigInteger 等于 Java 中的另一个 BigInteger 变量

java - JEdi​​tor Pane 打印水平滚动条问题