【问题标题】:visual vm force gc视觉 vm 力 gc
【发布时间】:2011-04-23 16:55:51
【问题描述】:
  1. 我对 POJO 的内存使用情况和实例数进行采样。如果当我在可视 vm 中按“垃圾收集”并且我可以看到实例关闭时,这是否意味着它没有内存泄漏?

  2. 如何强制 jvm 每天午夜进行垃圾收集? (就像在visualvm上自动按下垃圾收集一样)?我看到 visualvm 的 cpu 使用率,gc 总是 0%。我设置 -xmx -xms 1024m,但通常内存使用量在 200mb 左右。这是因为 GC 只在必要时进行吗?这就是为什么 gc cpu 时间总是 0%

  3. 如何查看上次执行 'full GC' 的时间?

【问题讨论】:

    标签: java memory-leaks visualvm


    【解决方案1】:
    1. 没有。没有真正具体的方法来确定您的应用程序是否没有内存泄漏。最好的办法是长时间运行浸泡测试,并确保活动堆的大小稳定。

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

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

    【讨论】:

      【解决方案2】:
      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 的时间。

      【讨论】:

      • 如果你在 tomcat 中有 3 个应用程序。和一个执行 System.gc() 的应用程序。这将自动 gc 所有 3 个应用程序,因为共享相同的 jvm 对吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-23
      • 1970-01-01
      相关资源
      最近更新 更多