我创建了一个带有一系列子项的trie树.删除单词时,我将子项设置为null,我假设删除该节点(delete是相对术语).我知道null不会删除子节点,只需将其设置为null,这在使用大量单词时会导致溢出堆.
在linux上运行top,我可以很快看到我的内存使用率飙升到1gb,但是如果我在删除后强制进行垃圾收集(Runtime.gc()),则内存使用量将达到50mb并且永远不会高于此值.据我所知,java默认情况下会在堆溢出发生之前运行垃圾收集,但是我无法看到这种情况发生.
(评论太长了)
相反到普遍的信仰,你的CAN真力时在Java中的GC但这不使用完成的System.gc() .真正强制GC的方法是使用JVMTI的ForceGarbageCollection()调用.不要问我更多,我在这里问了一个问题,没有人发现它很有趣(没有upvotes),也没有人能回答它,但JVMTI的ForceGarbageCollection()是许多Java程序如IntelliJ,NetBeans,VisualVM,Eclipse等的做法.真的强迫GC:
Java:你如何使用JVMTI的ForceGargabeCollection强制GC?
现在...你也许并不想这样做,你可能根本不希望暗示使用"无担保"的GC System.gc()的调用.
你有多少话开始有问题?当您需要使用疯狂的单词数时,有非常紧凑的数据结构.您确定使用的是正确的数据结构吗?您确定没有泄漏吗?
| 归档时间: |
|
| 查看次数: |
5181 次 |
| 最近记录: |