【问题标题】:How to monitor garbage collection to see what is GC'd?如何监控垃圾收集以查看 GC 是什么?
【发布时间】:2017-03-06 16:17:50
【问题描述】:

我有一个巨大的 Java 应用程序(运行 Jdk7 64Bit,Weblogic 12)。在没有任何人调用它的情况下运行应用程序 - 也就是闲置。我可以看到每 3-4 分钟有一个 300Mb 的峰值,然后使用视觉 vm 对其进行垃圾收集。

我获取了几个堆栈跟踪,并且在获取时没有任何内容处于忙碌状态。我们还利用了 EHCache 并添加了日志来记录结果。应用程序启动并运行后,我在日志中看不到任何内容(当它处于空闲状态时),但仍然会发生这个 300mb 的垃圾收集。

当已用空间较低且之后为 300mb 时进行堆转储,使用 eclipse 内存分析器并不会显示太大差异,内存分配看起来相同:

有没有办法查看垃圾收集的内容?而且我知道会有持续的收集,但是 300mb 可以吗?

【问题讨论】:

  • 有没有检查过对象创建是否异常?
  • 试图找出已收集的内容不会导致任何地方,因为尽管有俗称,但不会收集任何内容。 JVM 会检测到仍然可以访问的内容,即 not 垃圾,这就是为什么您在堆转储中看到的差异如此之小。除了少数例外,您只能转储可访问的内容。要查明发生了什么,您必须跟踪 allocations,您的监控工具也应该支持这些。但不要惊讶,如果事实证明是监控工具本身造成的......
  • 这张图对我来说看起来很正常。您的应用程序 - 或者更确切地说是 Weblogic - 随着时间的推移以恒定速率逐渐向堆中添加更多内容,然后在 750Mb 阈值左右,垃圾收集器运行。

标签: java garbage-collection visualvm


【解决方案1】:

你的记忆行为没有问题。即使您的应用程序处于空闲状态,也会发生许多事情,从而导致您正在观察内存分配。我假设您正在监视包括年轻代在内的总堆。因此,分配的每个对象都将显示在您的图表上。每 3-4 分钟一次的年轻 GC 绝对正常,每次只需几毫秒。

所以我会切换到只监控老年代,你会有一条非常平坦的线,根本没有 GC。

【讨论】:

    【解决方案2】:

    您所看到的是监控对您的应用程序的影响,因为它是用 Java 实现的。我建议您将-XX:+PrintGCDetails 添加到您的命令行中,并检查在有监控和无监控的情况下发生GC 的频率。

    是的,JMX 的垃圾率(300MB/5 分钟)是正常的。另外,您的应用程序有多大?超过 32 GB RAM?

    【讨论】:

    • 谢谢。 :) 我做了以下事情: 1. 我登录到 weblogic 控制台并取消部署所有工件。仍然是相同的行为。 2. 然后我按照您的建议添加了 PrintGCDetails。如果我连接了 visualVM,它只会对 300 奇数 mb 进行 GC。
    • 那是因为 VisualVM 正在轮询更改;如果您有其他类型的监控工具可以连接到 JMX,那么您会再次看到它(JMX 不能轻易地将更改推送到监控器)。但正如我所说,没关系。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-18
    • 1970-01-01
    相关资源
    最近更新 更多