如何使jvm外部进行垃圾收集

时间:2012-06-12 16:24:09

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

我将一个应用程序部署到生产环境,由于某些内存泄漏,有时会抛出OutOfMemory异常。它运行在无头ubuntu盒子上,我宁愿不远程连接visualvm,jconsole等。有没有办法让jvm做gc(就像在visualvm中你只需点击一个按钮就可以了)。

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

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

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