如何监控垃圾回收以查看什么是 GC?
How to monitor garbage collection to see what is GC'd?
我有一个巨大的 Java 应用程序(运行 Jdk7 64 位,Weblogic 12)。 运行 没有任何人调用它的应用程序 - 也就是闲置。我可以看到每 3-4 分钟就有一个 300Mb 的峰值,然后使用可视化虚拟机对其进行垃圾回收。
我拍了几个堆栈跟踪,拍的时候什么都不忙。我们还使用 EHCache 并添加了日志记录来记录结果。一旦应用程序启动并且 运行 我在日志中看不到任何内容(当它处于空闲状态时)但仍然有 300mb 的垃圾收集发生。
使用 eclipse 内存分析器时,当使用的 space 低时进行堆转储,之后 300mb 并没有显示出太大的差异,内存分配看起来相同:
有没有办法查看垃圾回收的内容?我知道会不断收集,但 300mb 可以吗?
你的记忆行为没有问题。即使您的应用程序处于空闲状态,许多事情仍在进行,导致您正在观察的内存分配。我假设您正在监视包括年轻一代在内的总堆。因此,分配的每个对象都会显示在您的图表上。每 3-4 分钟一次年轻的 GC 绝对正常,每次只需要几毫秒。
所以我会切换到只监控老年代,你会有一条非常平坦的线,根本没有 GC。
您看到的是 监控 对您的应用程序的影响,因为它是在 Java 中实现的。我建议您将 -XX:+PrintGCDetails
添加到您的命令行,并检查在有和没有监控的情况下 GC 发生的频率。
是的,垃圾率 (300MB/5min) 对于 JMX 来说是正常的。另外,您的应用程序有多大?超过 32 GB 内存?
我有一个巨大的 Java 应用程序(运行 Jdk7 64 位,Weblogic 12)。 运行 没有任何人调用它的应用程序 - 也就是闲置。我可以看到每 3-4 分钟就有一个 300Mb 的峰值,然后使用可视化虚拟机对其进行垃圾回收。
我拍了几个堆栈跟踪,拍的时候什么都不忙。我们还使用 EHCache 并添加了日志记录来记录结果。一旦应用程序启动并且 运行 我在日志中看不到任何内容(当它处于空闲状态时)但仍然有 300mb 的垃圾收集发生。
使用 eclipse 内存分析器时,当使用的 space 低时进行堆转储,之后 300mb 并没有显示出太大的差异,内存分配看起来相同:
有没有办法查看垃圾回收的内容?我知道会不断收集,但 300mb 可以吗?
你的记忆行为没有问题。即使您的应用程序处于空闲状态,许多事情仍在进行,导致您正在观察的内存分配。我假设您正在监视包括年轻一代在内的总堆。因此,分配的每个对象都会显示在您的图表上。每 3-4 分钟一次年轻的 GC 绝对正常,每次只需要几毫秒。
所以我会切换到只监控老年代,你会有一条非常平坦的线,根本没有 GC。
您看到的是 监控 对您的应用程序的影响,因为它是在 Java 中实现的。我建议您将 -XX:+PrintGCDetails
添加到您的命令行,并检查在有和没有监控的情况下 GC 发生的频率。
是的,垃圾率 (300MB/5min) 对于 JMX 来说是正常的。另外,您的应用程序有多大?超过 32 GB 内存?