2010-10-11 40 views
2
  1. 我对POJO的实例的内存使用量和计数数量进行采样。如果当我在视觉虚拟媒体中按'垃圾收集',我可以看到实例,这是否意味着它的内存泄漏免费?visual vm force gc

  2. 如何强制jvm在midgnight每天都做垃圾收集? (就像自动按visualvm上的垃圾收集)?我看到visualvm的cpu使用情况,gc总是0%。我设置了-xmx -xms 1024m,但通常内存使用量在200mb左右。这是因为GC只在必要时完成?这就是为什么总是0%为gc cpu时间

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

回答

5
  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的时间。
+0

如果您在tomcat中有3个应用程序。和一个做System.gc()的应用程序。那会自动gc所有3个应用程序,因为共享相同的jvm权利? – cometta 2010-10-11 08:53:28

+1

这是正确的 - 'gc()'调用是JVM范围的。 – 2010-10-11 09:18:22

1
  1. 号没有真正确定你的应用程序是免费的内存泄漏的具体方式。最好的做法是在延长的时间内进行浸泡测试,并确保活动堆的大小稳定。

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

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