Java堆溢出,强制垃圾收集

Nic*_*las 2 java heap

我创建了一个带有一系列子项的trie树.删除单词时,我将子项设置为null,我假设删除该节点(delete是相对术语).我知道null不会删除子节点,只需将其设置为null,这在使用大量单词时会导致溢出堆.

在linux上运行top,我可以很快看到我的内存使用率飙升到1gb,但是如果我在删除后强制进行垃圾收集(Runtime.gc()),则内存使用量将达到50mb并且永远不会高于此值.据我所知,java默认情况下会在堆溢出发生之前运行垃圾收集,但是我无法看到这种情况发生.

Syn*_*r0r 5

(评论太长了)

相反到普遍的信仰,你的CAN真力时在Java中的GC但这使用完成的System.gc() .真正强制GC的方法是使用JVMTI的ForceGarbageCollection()调用.不要问我更多,我在这里问了一个问题,没有人发现它很有趣(没有upvotes),也没有人能回答它,但JVMTI的ForceGarbageCollection()是许多Java程序如IntelliJ,NetBeans,VisualVM,Eclipse等的做法.真的强迫GC:

Java:你如何使用JVMTI的ForceGargabeCollection强制GC?

现在...你也许并不想这样做,你可能根本希望暗示使用"无担保"的GC System.gc()的调用.

你有多少话开始有问题?当您需要使用疯狂的单词数时,有非常紧凑的数据结构.您确定使用的是正确的数据结构吗?您确定没有泄漏吗?

  • 有趣的是,有一个人侮辱了我提出的那个问题,我说我很懒惰......即使是同一个人也很难达到20K代表回答更容易的问题,那些研究比我在JVMTI做的研究少得多的人肯定会问.我标记他的评论侮辱我是冒犯性的,欢迎任何读这个问题的人做同样的事情.此外,如果你认为知道如何真正做GC将是GC的一个很好的补充,请高兴我的问题. (2认同)