完整GC实时远远超过用户+系统时间

Sta*_*tas 12 java garbage-collection

我们有大约1.2 GB(总机物理内存2 GB)的允许的最大堆大小JBoss上运行的Web基于Java的应用程序.在某些时候,应用程序停止响应(对客户端)几分钟.经过一些分析,我们发现罪魁祸首是Full GC.以下是详细GC日志的摘录:

74477.402:[全GC [PSYoungGen:3648K-> 0K(332160K)] [PSOldGen:778476K-> 589497K(819200K)] 782124K-> 589497K(1151360K)[PSPermGen:102671K-> 102671K(171328K)],646.1546860秒] [ 时报:用户= 3.84 SYS = 3.72,实际= 646.17秒 ]

我不明白是怎么回事可能是实时花费在全GC是约11分钟(646秒),而用户+ SYS时间是7.5秒.7.5秒声音对我来说更合理的时间花在从老一代清洗<200 MB.所有其他时间去哪儿了?

非常感谢.

Ste*_*n C 10

所有其他时间去哪儿了?

您的应用程序很可能导致虚拟内存抖动.基本上,您的应用程序需要的虚拟内存页数远远多于可用于保存它们的物理页面.结果,它花费大部分时间等待从磁盘读取和写入vm页面.

有关更多信息,请阅读此维基百科页面.

解决方法是减少虚拟内存使用量或增加系统上的物理内存量.例如,您可以:

  • 在机器上运行的应用程序更少,
  • 减少Java应用程序堆大小,或
  • 如果您在虚拟机中运行,请增加虚拟物理内存的分配.

(但请注意,减少JVM堆大小可能是一把双刃剑.如果过多地减少堆大小,应用程序将死于OutOfMemoryErrors,花费太多时间进行垃圾回收,或者无法有效地缓存内容.)

  • @eckes - 是的我.`sys`时间组件是执行系统级代码所花费的CPU时间,而不是等待物理I/O所花费的实时时间. (2认同)