剩余大量内存时出现 java.lang.OutOfMemoryError (94GB/200GB Xmx)

标签 java linux memory out-of-memory rdf

我正在尝试创建大型 RDF/HDT 文件,这反过来意味着将大型文件读入内存等。现在,这不是真正的问题,因为服务器有 516GB 内存,其中大约 510GB 是免费的。

我正在使用 rdfhdt库来创建文件,效果很好。但是,对于一个特定的文件,我不断收到 OutOfMemoryError,没有真正的原因。这是堆栈跟踪:

 Exception in thread "main" java.lang.OutOfMemoryError
    at java.io.ByteArrayOutputStream.hugeCapacity(ByteArrayOutputStream.java:123)
    at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:117)
    at java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:93)
    at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:153)
    at org.rdfhdt.hdt.util.string.ByteStringUtil.append(ByteStringUtil.java:238)
    at org.rdfhdt.hdt.dictionary.impl.section.PFCDictionarySection.load(PFCDictionarySection.java:123)
    at org.rdfhdt.hdt.dictionary.impl.section.PFCDictionarySection.load(PFCDictionarySection.java:87)
    at org.rdfhdt.hdt.dictionary.impl.FourSectionDictionary.load(FourSectionDictionary.java:83)
    at org.rdfhdt.hdt.hdt.impl.HDTImpl.loadFromModifiableHDT(HDTImpl.java:441)
    at org.rdfhdt.hdt.hdt.writer.TripleWriterHDT.close(TripleWriterHDT.java:96)
    at dk.aau.cs.qweb.Main.makePredicateStores(Main.java:137)
    at dk.aau.cs.qweb.Main.main(Main.java:69)

我正在运行带有标记 -Xmx200G 的 Jar 文件。奇怪的是,当查看“顶部”时,它显示 VIRT 为 213G(如预期)。然而,每次 RES 攀升到大约 94GB 时,它都会因上述错误而崩溃,我认为这很奇怪,因为它应该还有超过 100GB 的空间可供使用。我看了this问题,因为问题似乎与我的相似,尽管规模不同。但是,使用 -verbose:gc 和 -XX:+PrintGCDetails 似乎没有给我任何关于错误的指示,并且有大约 500G 的交换空间也可用。

也许最奇怪的是,我遇到问题的特定文件甚至不是最大的文件。对于规模,它有大约 83M 的三元组要写入,而对于其他文件,高达 200M 的三元组不是问题。我使用的是 Java 版本 1.8.0_66 和 Ubuntu 版本 14.04.3 LTS。

所以我的问题是,是否有人可以解释我做错了什么?对我来说,较大的文件没有问题似乎很奇怪,但这个文件确实如此。如果您需要任何其他信息,请告诉我。

最佳答案

由于 Java 的最大数组长度,ByteArrayOutputStream 不能容纳超过 2GB 的数据。无论您当前的 RAM 量或内存限制如何,都是如此。这是 the code you're hitting :

private static int hugeCapacity(int minCapacity) {
    if (minCapacity < 0) // overflow
        throw new OutOfMemoryError();

您将不得不重写您的代码,以免尝试将那么多数据保存在一个数组中。

关于剩余大量内存时出现 java.lang.OutOfMemoryError (94GB/200GB Xmx),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53462161/

相关文章:

java - 如何将 mongodb 列中的所有值检索到 ArrayList 中?

java - 处理 HttpClient (Httpget) 超时

c++ - 为什么 Ubuntu 中使用 pthread 的单线程比多线程更快?

Docker 服务禁用内存交换

java - 索引和分页

c - 我的段错误在哪里?

linux - Shell脚本+时间依赖

Tomcat 服务器 JAVA 空闲内存未返回给操作系统

tomcat - 您在 Jenkins 上同时运行的最大作业数是多少,您的服务器的系统规范是什么,您的 CATALINA_OPTS 是什么?

java - 资源使用过多 : memcached Linux Centos 7