Java 试图理解此堆分析以确定内存泄漏或所需的大量内存

Java 试图理解此堆分析以确定内存泄漏或所需的大量内存,java,memory,memory-leaks,garbage-collection,stanford-nlp,Java,Memory,Memory Leaks,Garbage Collection,Stanford Nlp,我在一个3mb的html文件中进行解析,并使用Stanfords pos tagger对其进行标记,但总是因为OOM而失败。如果堆中有1gb,则会出现堆错误。如果我有7gb的堆,它会给出GC错误(花费太多时间GC,所以抛出错误)。我已经尝试更改GC以允许更多的时间进行GC,并更改了GC实现。因此,我观察到,更改堆大小并不能解决oom错误 我有一个主类,它使用Stanfords API(标记字符串和标记单词),并传入整个html页面(大量数字)。当我运行堆转储时,它说java.lang.Threa

我在一个3mb的html文件中进行解析,并使用Stanfords pos tagger对其进行标记,但总是因为OOM而失败。如果堆中有1gb,则会出现堆错误。如果我有7gb的堆,它会给出GC错误(花费太多时间GC,所以抛出错误)。我已经尝试更改GC以允许更多的时间进行GC,并更改了GC实现。因此,我观察到,更改堆大小并不能解决oom错误

我有一个主类,它使用Stanfords API(标记字符串和标记单词),并传入整个html页面(大量数字)。当我运行堆转储时,它说java.lang.Thread有700mb的保留堆。几乎所有内存都在double[]中,但我不知道如何利用这些信息来确定内存泄漏。我一直在努力寻找一个好的MAT教程(eclipse内存分析器工具),但很难找到一个好的资源

这是一个堆栈跟踪

The thread java.lang.Thread @ 0xdb8acd90 main keeps local variables with total size 721,109,984 (86.33%) bytes.

The memory is accumulated in one instance of "double[][]" loaded by "<system class loader>".
The stacktrace of this Thread is available. See stacktrace.



Keywords
double[][]

Details »



*main
  at java.lang.OutOfMemoryError.<init>()V (OutOfMemoryError.java:48)
  at edu.stanford.nlp.tagger.maxent.TestSentence.stringTagsAt(I)[Ljava/lang/String; (TestSentence.java:732)
  at edu.stanford.nlp.tagger.maxent.TestSentence.getApproximateScores(Ledu/stanford/nlp/tagger/maxent/History;)[D (TestSentence.java:393)
  at edu.stanford.nlp.tagger.maxent.TestSentence.getScores(Ledu/stanford/nlp/tagger/maxent/History;)[D (TestSentence.java:370)
  at edu.stanford.nlp.tagger.maxent.TestSentence.scoresOf([II)[D (TestSentence.java:713)
  at edu.stanford.nlp.sequences.ExactBestSequenceFinder.bestSequence(Ledu/stanford/nlp/sequences/SequenceModel;[[D)Ledu/stanford/nlp/util/Pair; (ExactBestSequenceFinder.java:91)
  at edu.stanford.nlp.sequences.ExactBestSequenceFinder.bestSequence(Ledu/stanford/nlp/sequences/SequenceModel;)[I (ExactBestSequenceFinder.java:31)
  at edu.stanford.nlp.tagger.maxent.TestSentence.runTagInference()V (TestSentence.java:322)
  at edu.stanford.nlp.tagger.maxent.TestSentence.testTagInference()Ljava/util/ArrayList; (TestSentence.java:312)
  at edu.stanford.nlp.tagger.maxent.TestSentence.tagSentence(Ljava/util/List;Z)Ljava/util/ArrayList; (TestSentence.java:135)
  at edu.stanford.nlp.tagger.maxent.MaxentTagger.tagSentence(Ljava/util/List;Z)Ljava/util/List; (MaxentTagger.java:998)
  at edu.stanford.nlp.tagger.maxent.MaxentTagger.tagCoreLabelsOrHasWords(Ljava/util/List;Ledu/stanford/nlp/process/Morphology;Z)Ljava/util/List; (MaxentTagger.java:1788)
  at edu.stanford.nlp.tagger.maxent.MaxentTagger$TaggerWrapper.apply(Ljava/lang/String;)Ljava/lang/String; (MaxentTagger.java:1291)
  at edu.stanford.nlp.tagger.maxent.MaxentTagger.tagString(Ljava/lang/String;)Ljava/lang/String; (MaxentTagger.java:933)
  at PageTagger.tagText(Ljava/lang/String;)Ljava/lang/String; (PageTagger.java:76)
  at PageTagger.main([Ljava/lang/String;)V (PageTagger.java:40)*
线程java.lang.thread@0xdb8acd90 main保留总大小为721109984(86.33%)字节的局部变量。
内存累积在一个由“”加载的“double[][]”实例中。
此线程的堆栈跟踪可用。参见stacktrace。
关键词
双重[][]
详情»
*主要
在java.lang.OutOfMemoryError。()V(OutOfMemoryError.java:48)
在edu.stanford.nlp.tagger.maxent.TestSession.stringTagsAt(I)[Ljava/lang/String;(testSession.java:732)
在edu.stanford.nlp.tagger.maxent.testsence.getApproximateScores(Ledu/stanford/nlp/tagger/maxent/History;)[D(testsence.java:393)
在edu.stanford.nlp.tagger.maxent.testsence.getScores(Ledu/stanford/nlp/tagger/maxent/History;)[D(testsence.java:370)
在edu.stanford.nlp.tagger.maxent.TestSession.scoresOf([II)[D(TestSession.java:713)
在edu.stanford.nlp.sequences.ExactBestSequenceFinder.bestSequence(Ledu/stanford/nlp/SequenceModel;[[D)Ledu/stanford/nlp/util/Pair;(ExactBestSequenceFinder.java:91)
在edu.stanford.nlp.sequences.ExactBestSequenceFinder.bestSequence(Ledu/stanford/nlp/sequences/SequenceModel;)[I(ExactBestSequenceFinder.java:31)
位于edu.stanford.nlp.tagger.maxent.TestSession.RunTagEnference()V(TestSession.java:322)
位于edu.stanford.nlp.tagger.maxent.TestSession.TestTagEnference()Ljava/util/ArrayList;(TestSession.java:312)
在edu.stanford.nlp.tagger.maxent.testsence.tagsence(Ljava/util/List;Z)Ljava/util/ArrayList;(testsence.java:135)
在edu.stanford.nlp.tagger.maxent.MaxentTagger.tagsence(Ljava/util/List;Z)Ljava/util/List;(MaxentTagger.java:998)
在edu.stanford.nlp.tagger.maxent.MaxentTagger.tagCoreLabelsOrHasWords(Ljava/util/List;Ledu/stanford/nlp/process/Morphology;Z)Ljava/util/List;(MaxentTagger.java:1788)
在edu.stanford.nlp.tagger.maxent.MaxentTagger$TaggerWrapper.apply(Ljava/lang/String;)Ljava/lang/String;(MaxentTagger.java:1291)
在edu.stanford.nlp.tagger.maxent.MaxentTagger.tagString(Ljava/lang/String;)Ljava/lang/String;(MaxentTagger.java:933)
在PageTagger.tagText(Ljava/lang/String;)Ljava/lang/String;(PageTagger.java:76)
在PageTagger.main([Ljava/lang/String;)V(PageTagger.java:40)*


如果我能提供任何信息,请告诉我。

在一个块中处理一个3GB的网页需要比分配的内存多得多的内存。我天真的猜测大约是几十GB。我的建议是将网页分成更小的部分,并分别在每个部分上运行。词性标记器对一个句子进行操作-不管怎么说,如果你的文档有连贯的句子,这是一个很自然的分割边界。

很抱歉,这是一个打字错误,3mb。谢谢你的帮助,我已经完成了程序的工作,现在我仍在试图了解更多关于内存分析部分的信息以及它发生的原因。啊,在7GB中运行应该可以。你感觉如何你在叫CoreNLP?网页是什么样子的?它可能是网页本身的一些古怪的属性(例如,它是一个很长的句子)。基本上,他们有一个名为tagText的方法,我传入整个html,它实际上只是由空格“123 456 12312”分隔的数百万个数字以此类推,比如说……10个数字,我不知道有多少新行。我发送了大量的html,它工作了,但作为一个整体,它得到了OOM。好吧,那么这可能是因为句子太长,标记器无法作为一个块来处理。我认为分块发送是正确的答案。另外,出于好奇,为什么要这样做你给这个文档加标签了吗?如果它真的只是数字,那么每个标签都应该是
CD