视觉vm force gc

时间:2010-10-11 08:22:53

标签: java memory-leaks visualvm

  1. 我对POJO的内存使用量和实例数量进行采样。如果我在视觉vm中按“垃圾收集”并且我可以看到实例,这是否意味着它的内存泄漏?

  2. 如何强制jvm每天在中途做垃圾收集? (就像在visualvm上自动按垃圾收集一样)?我看到visualvm的cpu用法,gc总是0%。我设置-xmx -xms 1024m,但通常内存使用量约为200mb。这是因为GC只在必要时才完成?这就是gc cpu time总是0%的原因

  3. 如何检查上次执行'完整GC'的时间?

2 个答案:

答案 0 :(得分:6)

  1. 不,不一定。所有这些都意味着可以收集某些对象。例如,如果实例计数总是在GC之后下降但是与之前的级别不同,那么您仍然可能有垃圾泄漏;如果这个“基线”随着时间的推移而增加,你偶尔会耗尽内存。此外,很难证明是负面的,因此可能是您的应用程序确实存在内存泄漏错误,但是这种特定情况并没有行使它。
  2. 让我们澄清一件事 - 你永远不能强迫JVM运行垃圾收集。您可以做的最好的事情是调用System.gc(),它是JVM的提示,它现在可能要运行GC。它不需要做任何事情,并且该方法的无操作实现将是完全有效的。基本上,垃圾收集“只是发生”,你对它的特定期望越少越好。所以基本上,是的,它通常只在需要时运行。
  3. 同样,这通常是内部知识,细节将取决于您使用的垃圾收集器实现。但是,对于Sun的JVM,您可以使用命令行参数-verbose:gc将详细的垃圾回收详细信息输出到控制台。如果要以编程方式或可视方式检查详细信息,也可以通过JMX公开此信息(即set up your process to use JMX remoting,并使用JConsole连接到它)。对我来说,使用Sun的1.5.0_06 JVM,我在java.lang.GarbageCollector中看到一个MBean,它公开了一些信息,包括上一次完整GC的时间。

答案 1 :(得分:1)

  1. 没有。没有确切的具体方法来确定您的应用程序是否内存泄漏。最好是在较长时间内进行浸泡测试,并确保活堆的大小稳定。

  2. 您可以使用System.gc()方法调用来运行垃圾收集器。

  3. 似乎没有用于上次运行GC的API,但GarbageCollectorMXBean可以提供有关GC的一些统计信息。

相关问题