我对 POJO 的内存使用情况和实例数进行采样。如果当我在可视 vm 中按“垃圾收集”时我可以看到实例关闭,这是否意味着它没有内存泄漏?
如何强制jvm每天在午夜进行垃圾收集?(就像在visualvm上自动按下垃圾收集一样)?我看到 visualvm 的 cpu 使用率,gc 总是 0%。我设置 -xmx -xms 1024m,但通常内存使用量在 200mb 左右。这是因为 GC 只在必要时进行吗?这就是为什么 gc cpu 时间总是 0%
如何检查上次执行“full GC”的时间?
问问题
5121 次
2 回答
6
- 不,不一定。这实际上意味着可以收集您的一些对象。例如,如果实例计数在 GC 之后总是下降,但没有完全达到以前的水平,那么您仍然可能会发生垃圾泄漏;如果这个“基线”随着时间的推移而增加,你偶尔会耗尽内存。此外,很难证明是否定的,因此可能是您的应用程序确实存在内存泄漏错误,但这种特定情况并没有发挥作用。
- 让我们澄清一件事——你永远不能强迫 JVM 运行垃圾收集。您可以做的最好的事情是 call
System.gc()
,这是对 JVM 的一个提示,它现在可能想要运行 GC。它不需要做任何事情,并且该方法的无操作实现将是完全有效的。基本上,垃圾收集“只是发生”,你对它的具体期望越少越好。所以基本上,是的,它通常只会在需要时运行。 - 同样,这通常是内部知识,细节将取决于您使用的垃圾收集器实现。但是,对于 Sun 的 JVM,您可以使用命令行参数
-verbose:gc
将详细的垃圾收集详细信息输出到控制台。如果您想以编程方式或视觉方式检查详细信息,这些信息也可能通过 JMX 公开(即设置您的进程以使用 JMX 远程处理,并使用 JConsole 连接到它)。对我来说,使用 Sun 的 1.5.0_06 JVM,我在 java.lang.GarbageCollector 中看到了一个 MBean,它公开了一些信息,包括最后一次完整 GC 的时间。
于 2010-10-11T08:36:14.470 回答
1
不,没有真正具体的方法来确定您的应用程序是否没有内存泄漏。最好的方法是长时间运行浸泡测试,并确保活动堆的大小稳定。
您可以使用
System.gc()
方法调用来运行垃圾收集器。似乎没有用于获取 GC 上次运行时间的 API,但是GarbageCollectorMXBean可以提供有关 GC 的一些统计信息。
于 2010-10-11T08:39:13.140 回答