Java堆溢出,强制垃圾收集

标签 java heap-memory

我已经创建了一个带有子数组的 trie 树。删除单词时,我将子项设置为 null,我认为这会删除节点(删除是一个相对术语)。我知道 null 不会删除子项,只是将其设置为 null,这在使用大量单词时会导致堆溢出。

在 linux 上运行 top,我可以看到我的内存使用量很快飙升至 1gb,但如果我在删除 (Runtime.gc()) 后强制进行垃圾回收,内存使用量将达到 50mb 并且永远不会超过该值。据我所知,java 默认情况下会在堆溢出发生之前运行垃圾回收,但我看不到它会发生。

最佳答案

(评论太长了)

与流行的看法相反,您可以确实在 Java 中强制执行 GC,但这不是使用 System.gc() 完成的。真正强制 GC 的方法是使用 JVMTI 的 ForceGarbageCollection() 调用。不要问我更多,我在这里问了一个问题,但没有人觉得它有趣(没有投票),也没有人能回答它,但是 JVMTI 的 ForceGarbageCollection() 是许多 Java 程序,如 IntelliJ、NetBeans 、VisualVM、Eclipse 等。确实会强制执行 GC:

Java: How do you really force a GC using JVMTI's ForceGargabeCollection?

现在...您可能不想这样做并且您可能不想想要使用“不保证”系统来提示 GC。 gc() 调用。

您从多少个单词开始出现问题?当您需要处理大量单词时,数据结构非常紧凑。您确定您使用的是正确的数据结构并且您确定没有泄漏吗?

关于Java堆溢出,强制垃圾收集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2429623/

相关文章:

Android:位图、软引用和 OOM?

java - 测试检查 boolean 表达式的方法时的 Junit 模式

java - 使用java + spring实现时间段(Window)

C - 如何限制堆中的地址访问?

java - 64 位 CentO 上 Tomcat 6 的最大堆大小?

haskell - 过多的垃圾收集(和内存使用?)

java - Spring Boot应用程序内存消耗

java - 您可以在多个线程上(同时)运行一个主方法吗?

Java 设计模式

java - 如何修复返回额外的零