0

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

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

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

4

2 回答 2

2

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

于 2012-06-12T18:23:30.330 回答
0

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

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

于 2012-06-12T16:28:25.690 回答