视觉vm force gc

com*_*tta 2 java memory-leaks visualvm

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

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

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

And*_*yle 6

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