试图理解这个堆分析,以确定内存泄漏或只需要大量的内存

时间:2015-09-17 00:51:32

标签: 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.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)*

enter image description here

enter image description here

enter image description here

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

1 个答案:

答案 0 :(得分:2)

您需要的内存比分配在一个块中处理3GB网页所需的内存多得多。我天真的猜测是几十GB的数量级。我的建议是将网页拆分成更小的部分,并分别在每个部分上运行?无论如何,词性标注器都会逐句运行,因此如果您的文档具有连贯的句子,则这是一个自然的分界线。