java - JAXP00010004 和 java.lang.OutOfMemoryError : GC overhead limit exceeded

标签 java maven jvm rdf4j

当我需要解析一个大的rdf文件时,我有一个maven项目。

我的代码是:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import org.eclipse.rdf4j.model.Model;
import org.eclipse.rdf4j.model.Statement;
import org.eclipse.rdf4j.model.impl.LinkedHashModel;
import org.eclipse.rdf4j.rio.RDFFormat;
import org.eclipse.rdf4j.rio.RDFHandlerException;
import org.eclipse.rdf4j.rio.RDFParseException;
import org.eclipse.rdf4j.rio.RDFParser;
import org.eclipse.rdf4j.rio.RDFWriter;
import org.eclipse.rdf4j.rio.Rio;
import org.eclipse.rdf4j.rio.helpers.StatementCollector;

public class ConvertOntology {

    public static void main(String[] args) throws RDFParseException, RDFHandlerException, IOException {
        // TODO Auto-generated method stub

        String file = "C:\\Users\\user\\Desktop\\fileA.rdf";

        File initialFile = new File(file);
        InputStream input = new FileInputStream(initialFile);


        RDFParser parser = Rio.createParser(RDFFormat.RDFXML);
        parser.setPreserveBNodeIDs(true); 

        Model model = new LinkedHashModel();
        parser.setRDFHandler(new StatementCollector(model));
        parser.parse(input, initialFile.getAbsolutePath());

        FileOutputStream out = new FileOutputStream("C:\\Users\\user\\Desktop\\fileB.rdf");
        RDFWriter writer = Rio.createWriter(RDFFormat.RDFXML, out);
        try {
          writer.startRDF();
          for (Statement st: model) {

                    writer.handleStatement(st);
          }
          writer.endRDF();
        }
        catch (RDFHandlerException e) {
         // oh no, do something!
        }
        finally {
          out.close();
        }
    }

}

代码字适用于小文件,但对于大文件,我得到以下异常(exception)

JAXP00010001: The parser has encountered more than "64000" entity expansions in this document; this is the limit imposed by the JDK

在 Eclipse 中,我通过单击运行>>运行配置>>参数来运行项目,然后在 VM 参数中设置 -DentityExpansionLimit=1000000。由于内存限制,我得到了一个新的异常(exception):

the Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded

所以我可以设置的最大堆小于文件所需的大小。所以我想在服务器上执行我的代码。通常我通过以下方式在服务器上编译并运行我的 Maven:

mvn compile
mv exec:java

我的问题: 我在 Maven 中设置 -DentityExpansionLimit=5000000

mvn -DentityExpansionLimit=5000000 exec:java

但我得到了一个原始异常:

[ERROR] Failed to execute goal org.codehaus.mojo:exec-maven-plugin:1.2.1:java (default-cli) on project rdf4j-getting-started: An exception occured while executing the Java class. null: InvocationTargetException: JAXP00010004: The accumulated size of entities is "50,000,018" that exceeded the "50,000,000" limit set by "FEATURE_SECURE_PROCESSING". [line 1, column 34] -> [Help 1]

如何解决这个问题?

最佳答案

通过使用mvn -Djdk.xml.totalEntitySizeLimit=0 -DentityExpansionLimit=0 exec:java我解决了我的问题。希望能有所帮助

关于java - JAXP00010004 和 java.lang.OutOfMemoryError : GC overhead limit exceeded,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53364911/

相关文章:

java - 组合 assert 和 switch 语句

java.lang.NoClassDefFoundError : in eclipse maven 错误

Java 字节码签名

linux - 在不使用 M2 存储库但使用系统 jar 的情况下使用 Maven 离线构建项目

java - OpenJDK 与 Java HotspotVM

java - Java使用的内存多于堆大小(或正确大小的Docker内存限制)

Java 与 JavaDB 的通信 classNotFoundException

java - 实现 Iterable 与实现 Iterator

java - 为什么要在 javamail 中迭代多部分电子邮件中的各个部分?

java - 使用带有官方 Google Appengine Maven 插件的 Java 7