我有一个巨大的Java应用程序(运行Jdk7 64Bit,Weblogic 12)。在没有人调用它的情况下运行应用程序 - 也就是空闲。我可以看到每3-4分钟有一个300Mb的尖峰,然后使用visual vm进行垃圾收集。
我拍摄了几个堆栈跟踪,当时它没有任何忙碌。我们还使用EHCache并添加日志记录来记录结果。一旦应用程序启动并运行,我就无法在日志中看到任何内容(当它处于空闲状态时),但仍然会发生此300mb垃圾收集。
当使用的空间很小时使用堆转储,之后300mb并没有使用eclipse内存分析器显示差异,内存分配看起来相同:
有没有办法看到什么是垃圾收集?而且我确实知道会有不断收集但是300mb好吗?
答案 0 :(得分:2)
你的记忆行为没有问题。即使您的应用程序处于空闲状态,也会发生很多事情,从而导致您正在观察的内存分配。我认为你正在监视包括年轻一代的总堆。因此,分配的每个对象都将显示在图表上。每3-4分钟一次年轻的GC绝对正常,每次只需几毫秒。
所以我会转而只监视老一代,你会有一条非常扁平的线路,根本没有GC。
答案 1 :(得分:1)
您看到的是监控对您的应用程序的影响,因为它是用Java实现的。我建议您在命令行中添加-XX:+PrintGCDetails
,并检查GC在没有监控的情况下发生的频率。
是的,JMX的垃圾率(300MB / 5分钟)是正常的。另外,您的申请有多大?超过32 GB RAM?