【问题标题】:how to make a jvm do garbage collection externally如何让 jvm 在外部进行垃圾收集
【发布时间】:2012-06-15 13:51:09
【问题描述】:

我有一个部署到生产环境的应用程序,由于某些内存泄漏,它有时会抛出 OutOfMemory 异常。它在一个无头 ubuntu 盒子上运行,我不希望在该盒子上远程连接 visualvm、jconsole 等。有没有办法让jvm 做 gc(比如在 visualvm 中,您只需单击一个按钮即可)。

我想运行jmap -histo:live <pid> 和这个 gc 命令,以找出哪些对象在 gc 中幸存。哪些对象数量正在增长等。现在我可以看到一些意外的对象数量,但它发生在我的许多域对象中,所以我不确定它是延迟 gc 还是内存泄漏。

简而言之,我正在寻找针对jvm pid 运行的linux 命令,以使其执行gc。不是 system.gc。

【问题讨论】:

  • 如果由于内存泄漏导致内存不足,运行 gc 将无济于事。当 gc 无法删除“死”对象时,就会发生内存泄漏,因为存在对它们的隐藏引用。
  • 是的,看起来像复制品。感谢您的链接。当我搜索/输入 q 时,我没有看到它出现。
  • OOM 意味着你没有更多的内存(或者至少在 GC 完成后没有足够的连续空间是它的东西。它已经执行了,再做一遍如何启动并不能解决任何问题。你可以检测到应用程序没有运行并重新启动它作为临时措施,但您需要做的是整理代码。应该超出范围的东西不是。

标签: java linux memory-leaks garbage-collection jvm


【解决方案1】:

pretty hard 在 Java 中得到真正的内存泄漏。如果您遇到内存不足错误,则很可能意味着您实际上内存不足。所以要解决这个问题,您需要找到对未使用对象的引用并手动清理它们。因为否则,垃圾收集器无法释放浪费的内存。

当 JVM 无法分配更多内存时,垃圾收集器应该会自动运行。

【讨论】:

  • 我已经有一段时间没有使用Java了,这个问题已经很老了,但是这个信息并不准确。至少在 Java 5 之前,在对象之间获得循环依赖绝对是很容易的。当您使用对象池、复杂数据结构或作为框架之间的交互时,可能会发生这种情况。学习使用 JVM 检查工具。它们将使您受益匪浅,您肯定会在生产中遇到 JVM 内存问题。
【解决方案2】:

当堆满时,GC 会积极尝试清理未引用的对象。所以它不是“延迟的 gc”。我认为您走在正确的轨道上,使用 jmap 并获得堆转储。然后对其进行分析以查看哪些应用程序对象不应该存在。您可能需要获取几个堆转储并将它们相互比较。

【讨论】:

    猜你喜欢
    • 2019-11-15
    • 2011-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多