代码之家  ›  专栏  ›  技术社区  ›  Nicholas

Java堆溢出,强制垃圾收集

  •  2
  • Nicholas  · 技术社区  · 15 年前

    我已经创建了一个包含子元素数组的trie树。当删除一个单词时,我将children设置为null,我将假定它删除节点(delete是一个相对术语)。我知道null不会删除子级,只是将其设置为null,当使用大量单词时会导致堆溢出。

    在linux上运行top,我可以很快看到内存使用量达到1gb,但是如果我在delete(Runtime.gc())之后强制垃圾回收,内存使用量就会达到50mb,而且永远不会超过这个值。据我所知,java默认情况下在堆溢出发生之前运行垃圾收集,但我看不到如何实现这一点。

    5 回复  |  直到 15 年前
        1
  •  3
  •   Esko Luontola    15 年前

    你指的是没有释放到操作系统的内存吗。 top

    VisualVM 或者类似的Java专用工具。如果您的机器有大量内存,那么JVM将使用它(IIRC,特别是服务器VM被调优为保留更多内存),但是您可以使用 -Xmx

        2
  •  5
  •   Community Mohan Dere    8 年前

    (这段话太长了,不能发表评论)

    与你的普遍看法相反 在Java中强制GC,但这是 完成使用 System.gc() . 真正强制GC的方法是使用JVMTI的 打电话。别再问我了,我在这里问了一个问题,没人觉得有趣(没有投票),也没人能回答,然而JVMTI 很多Java程序,比如IntelliJ、NetBeans、VisualVM、Eclipse等等。 你真的要强迫GC吗 :

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

    想要提示GC使用“不保证” 打电话。

        3
  •  1
  •   Enno Shioji    15 年前

    好的,你得到一个 java.lang.OutOfMemoryError: Java heap space .
    很可能, Runtime.gc()

    可能是内存泄漏。如果我是你的话,我会仔细检查我的代码,看看是否还有一些引用。

    当我做我的删除,我只是把它设置为 子节点为null,但不是 孩子的孩子,但是那些 孩子们从来没有初始化过, 仅创建(Node[]children=new

    如果你这样做了 children=null ,是的,整个数组应该是gc'd。前提是你没有提到什么。

        4
  •  0
  •   msw    15 年前

    在Unix中,分配给进程(即JVM)的内存不一定返回给操作系统。因此,即使Java虚拟机可能已经完全垃圾回收了堆,进程大小也可能保持不变。

    ps -u 不同之处在于交换了多少页。

        5
  •  0
  •   crazyscot    15 年前

    只有当任何可访问对象的链接无法再访问某个对象时,才会删除该对象。有没有可能你还引用了相关的对象?

    Runtime.gc() 有时只是垃圾收集应该运行的提示。