【发布时间】: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