内存不足错误:Java 堆空间

Posted

技术标签:

【中文标题】内存不足错误:Java 堆空间【英文标题】:Out of Memory Error: Java Heap space 【发布时间】:2015-01-30 11:24:51 【问题描述】:

我正在尝试使用映射字节缓冲区读取文件,并在 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;

【问题讨论】:

转到eclipse配置设置文件,即ini文件更改perm大小 因为代码不包含所有信息。这里只是猜测int size = buffer.getInt(); 可能会返回一个巨大的整数。 你看过这个链接吗 mkyong.com/eclipse/…> 这个链接会有所帮助。我认为仅仅增加堆大小就可以解决问题。 @Rishikesh.. 增加堆大小不是解决方案,因为代码可以正常工作几个月。但我最近遇到了这个错误。 【参考方案1】:

在 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 内存分析器来检查堆转储,也可以使用任何分析器,例如 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

【讨论】:

【参考方案2】:

转到 Eclipse 配置设置文件,即 ini 文件更改 perm 大小 下面的评论告诉你增加 permsize

-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

【讨论】:

你认为为什么会涉及 permgen? OP 明确表示错误是 JavaHeapSpace 内存不足,而不是 PermGen 空间。 @Erwin Bolwidt javaHeap Space 和 permGen Space 都显示在 JVM 内存不足时发生。 当 PermGen 空间用完时,java.lang.OutOfMemoryError: PermGen space 除外。 OP 说他的错误是OutOfMemoryError: JavaHeapSpace 所以问题中没有迹象表明涉及 PermGen。如果您仍然认为可能是,您可以在评论中询问 OP。 @Erwin 为什么投反对票回答两个错误略有不同,但我给出的解决方案可能会解决问题 我不会同时投反对票和评论。但我理解一个反对意见:答案并不意味着预感,尤其是当它们与 OP 发布的内容相矛盾时。

以上是关于内存不足错误:Java 堆空间的主要内容,如果未能解决你的问题,请参考以下文章

Eclipse 堆空间(内存不足错误)

理解 JVM 内存分配和 Java 内存不足:堆空间

Hive - 内存不足异常 - Java 堆空间

内存不足:Java 堆空间,但在查看堆空间时最大使用 50 MB

内存不足错误:Android Studio 上的 Java 堆内存

sparklyr中的堆空间不足,但有足够的内存