我在 生产环境 中遇到了一个奇怪的问题,经过5年多的运作后才发生一次 . 我们发现PSPermGen和'实际'持续时间远远高于用户系统的时间 . 2016年2月4日,PSPermGen在之前的运行时间为0.2-0.3秒,并且没有释放内存,耗时38.96秒 . 当用户系统为0.3-0.4秒时,实时花费40秒,这与之前的运行相比异常高 . 没有看到完整的GC频繁发生,我也没有观察到任何GC相关的错误 . CPU使用率<1%,持续时间内内存使用率<20% .
INFO | jvm 1 | 2016/02/04 02:56:56 | [GC [PSYoungGen:88312K-> 936K(86144K)] 261016K-> 174219K(260928K),0.4070215 secs] [次:用户= 0.75 sys = 0.00,real = 0.42 secs] INFO | jvm 1 | 2016/02/04 02:57:08 | [GC INFO | jvm 1 | 2016/02/04 02:57:11 | [PSYoungGen:85703K-> 96K(102400K)] 258985K-> 175019K(278784K),3.1902546 secs] [次:用户= 7.14 sys = 0.05,real = 3.18 secs] INFO | jvm 1 | 2016/02/04 02:57:13 | [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[ jvm 1 | 2016/02/04 02:57:20 | [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[ jvm 1 | 2016/02/04 02:57:28 | [GC [PSYoungGen:143616K-> 977K(144704K)] 318907K-> 176319K(321088K),0.0035773 secs] [次:用户= 0.00 sys = 0.00,real = 0.00 secs] INFO | jvm 1 | 2016/02/04 02:57:28 | [完整GC状态|包装| 2016/02/04 02:58:03 | JVM显示为挂起:等待来自JVM的信号超时 . 重新启动JVM . 信息| jvm 1 | 2016/02/04 02:58:08 | [PSYoungGen:977K-> 0K(144704K)] [PSOldGen:175341K-> 35127K(174784K)] 176319K-> 35127K(319488K)[PSPermGen:38992K-> 38992K(65536K)],38.9595115 secs] [次:用户= 0.33 sys = 0.14,real = 40.07 secs]
最后几个完整的GC执行的是:
INFO | jvm 1 | 2016/02/02 12:59:49 | [Full GC [PSYoungGen:433K-> 0K(98944K)] [PSOldGen:176749K-> 38591K(174784K)] 177183K-> 38591K(273728K)[PSPermGen:39380K-> 39380K(65536K)],0.2982459 secs] [Tim es :user = 0.30 sys = 0.00,real = 0.30 secs] 21189 INFO | jvm 1 | 2016/02/03 03:15:16 | [Full GC [PSYoungGen:2873K-> 0K(125696K)] [PSOldGen:171318K-> 33804K(174784K)] 174191K-> 33804K(300480K)[PSPermGen:39940K-> 38366K(65536K)],0.3317803 secs] [T imes :user = 0.34 sys = 0.00,real = 0.34 secs] 47151 INFO | jvm 1 | 2016/02/03 12:16:51 | [Full GC [PSYoungGen:1406K-> 0K(171776K)] [PSOldGen:174936K-> 38003K(174784K)] 176342K-> 38003K(346560K)[PSPermGen:38642K-> 38642K(65536K)],0.2988259 secs] [T imes :user = 0.30 sys = 0.00,real = 0.30 secs]
我在Windows 2003 x86上运行Java 6更新45,大约8GB和4个CPU . 磁盘空间绰绰有余 . 我们将JVM配置为初始堆内存为256 MB,最大内存为512 MB . 该应用程序通过Tanuki Wrapper作为Windows服务运行 .
目前看起来似乎没有长时间的GC暂停是由于内存,CPU,磁盘空间等 . 我在这里缺少什么?
1 回答
我刚刚在http://www.evanjones.ca/jvm-mmap-pause.html发现了一篇文章,其中提出问题可能出在磁盘IO上,可以通过设置-XX:PerfDataDisableSharedMem来解决 . 但是,这里的另一个链接:http://mail.openjdk.java.net/pipermail/hotspot-runtime-dev/2015-March/014324.html表明这会影响监视工具,如jcmd和jps