Vit*_*aly 13 java memory-management
我们的服务器经历了几分钟的滞后.可能它们是由"停止世界"垃圾收集引发的.但是我们使用并发标记和扫描GC(-XX:+ UseConcMarkSweepG),所以,我认为,这些暂停是由旧一代的内存碎片触发的.
如何分析老一代的记忆碎片?它有什么工具吗?
每小时发生一次陷阱.大多数时间他们大约20秒,但有时 - 几分钟.
查看Java文档中的"java -X ..."选项以打开GC日志记录.这将告诉您是否正在收集旧的或新的一代,以及收集的时间.
暂停"几分钟"听起来非同寻常.您确定不仅仅是运行堆大小太小,还是在物理内存不足的机器上运行?
如果您的堆太接近满,GC将一次又一次地触发,导致您的服务器在GC中花费大部分CPU时间.这将显示在GC日志中.
如果在物理内存不足的计算机上使用大堆,则完整的GC可能会导致计算机"崩溃",花费大部分时间疯狂地将虚拟内存页移入和移出光盘.您可以使用系统监控工具观察到这一点; 例如,在典型的UNIX/Linux系统上观看"vmstat 5"的控制台输出.
跟进
与OP的观点相反,打开GC记录不太可能对性能产生明显的影响.
在了解并发标记清扫垃圾收集日志甲骨文网站上的网页应该是在解释GC日志很有帮助.
最后,OP的结论是这是一个"碎片化"的问题是不可能的,并且(IMO)没有得到他提供的证据片段的支持.它很可能是别的东西.