添加属性时超出 GC 开销限制

GC overhead limit exceeded when adding properties

我刚开始为 java 使用 StanfordCoreNlp 库,在添加 coref 或 dcoref 注释属性时,我一直收到 GC 开销限制错误。知道如何解决这个问题吗?

出于测试目的,我逐渐将 JVM maxHeap 内存更改为 8GB ram,这绝对不是 issue.I 尝试从属性中删除几个标签,这是唯一一个似乎可以解决开销的标签错误,它也只在 StanfordCoreNlp 上给出错误,simpleCore api 可以正常工作,但效果不佳。代码片段与斯坦福官方文档中提供的示例相同。

public static void main(String[] args) {

            // run all Annotators on this text
            Properties props = new Properties();
            props.setProperty("annotators", "tokenize, ssplit, pos, lemma,ner, parse, coref");
            StanfordCoreNLP pipeline = new StanfordCoreNLP(props);

// read some text in the text variable
            String text = "who is here?"; // Add your text here!
            Annotation document = new Annotation(text);

// run all Annotators on this text
            pipeline.annotate(document);

这是确切的错误消息:

Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded
    at java.util.Arrays.copyOfRange(Arrays.java:3664)
    at java.lang.String.<init>(String.java:207)
    at edu.stanford.nlp.util.StringUtils.splitOnChar(StringUtils.java:537)
    at edu.stanford.nlp.coref.data.Dictionaries.loadGenderNumber(Dictionaries.java:406)
    at edu.stanford.nlp.coref.data.Dictionaries.<init>(Dictionaries.java:676)
    at edu.stanford.nlp.coref.data.Dictionaries.<init>(Dictionaries.java:576)
    at edu.stanford.nlp.coref.CorefSystem.<init>(CorefSystem.java:32)
    at edu.stanford.nlp.pipeline.CorefAnnotator.<init>(CorefAnnotator.java:67)
    at edu.stanford.nlp.pipeline.AnnotatorImplementations.coref(AnnotatorImplementations.java:196)
    at edu.stanford.nlp.pipeline.StanfordCoreNLP.lambda$getNamedAnnotators(StanfordCoreNLP.java:532)
    at edu.stanford.nlp.pipeline.StanfordCoreNLP$$Lambda/2137589296.apply(Unknown Source)
    at edu.stanford.nlp.pipeline.StanfordCoreNLP.lambda$null(StanfordCoreNLP.java:602)
    at edu.stanford.nlp.pipeline.StanfordCoreNLP$$Lambda/1798286609.get(Unknown Source)
    at edu.stanford.nlp.util.Lazy.compute(Lazy.java:126)
    at edu.stanford.nlp.util.Lazy.get(Lazy.java:31)
    at edu.stanford.nlp.pipeline.AnnotatorPool.get(AnnotatorPool.java:149)
    at edu.stanford.nlp.pipeline.StanfordCoreNLP.<init>(StanfordCoreNLP.java:251)
    at edu.stanford.nlp.pipeline.StanfordCoreNLP.<init>(StanfordCoreNLP.java:192)
    at edu.stanford.nlp.pipeline.StanfordCoreNLP.<init>(StanfordCoreNLP.java:188)
    at StanfordCoreNLPtest.main(StanfordCoreNLPtest.java:31)

进程已完成,退出代码为 1

据我所知,这只能是Java 运行内存不足导致的——这里只是加载字典,并没有陷入任何死循环。您确定要指定如何正确设置可用内存吗?例如,如果 运行ning 在 Eclipse 下,您需要设置应用程序的内存而不是分配给 Eclipse 的内存。 8GB 应该足以 运行 带有任何选项的 CoreNLP(除非文档很大,但文档加载发生在加载 coref 之后)。但是您可以尝试使用 12GB 以防万一,看看会发生什么....