0

我在生产中遇到了一个奇怪的问题,它在经过5年多的运营后才出现过一次。我们发现PSPermGen和'真实'的持续时间远远高于用户+系统时序。 2016年2月4日,PSPermGen在之前的运行时间为0.2-0.3秒时耗时38.96秒,并且没有释放内存。当用户+ sys为0.3-0.4秒时,实时花费40秒,与以前的运行相比,这是异常高的。完整的GC未被发现经常发生,我也没有观察到与GC有关的任何错误。 CPU使用率为< 1%,内存使用率为<,持续时间为20%。完整GC期间'PSPermGen'和'真实'时间与'用户'和'系统'相比较长时间

信息| jvm 1 | 2016/02/04 02:56:56 | [GC [PSYoungGen: 88312K-> 936K(86144K)] 261016K-> 174219K(260928K),0.4070215秒] [Times:user = 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 | INFO | [PSYoungGen:85703K-> 96K(102400K)] 258985K-> 175019K(278784K), 3.1902546秒] [Times:user = 7.14 sys = 0.05,real = 3.18 secs] INFO | jvm 1 | 2016/02/04 02:57:13 | [GC [PSYoungGen: 102368K-> 755K(123520K)] 277291K-> 175700K(299904K),0.0266474秒] [时间:用户= 0.00 sys = 0.00,实际= 0.02秒] INFO | jvm 1 | 2016/02/04 02:57:20 | [GC [PSYoungGen:123507K-> 128K(144768K)] 298452K-> 175419K(321152K),0.0021357秒] [Times:user = 0.01 sys = 0.01, real = 0.02sec] INFO | jvm 1 | 2016/02/04 02:57:28 | [GC: [PSYoungGen:143616K-> 977K(144704K)] 318907K-> 176319K(321088K), 0.0035773秒] [时间:用户= 0.00 sys = 0.00,实际= 0.00秒] INFO | jvm 1 | 2016/02/04 02:57:28 | [完整GC状态|包装| 2016/02/04 02:58:03 | JVM挂起:从JVM等待信号 超时。重新启动JVM。 INFO | 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秒] [时报:用户= 0.33 SYS = 0.14,实际= 40.07秒]

最后几充分的GC执行的是:

信息| jvm 1 | 2016/02/02 12:59:49 | [全GC [PSYoungGen: 433K-> 0K(98944K)] [PSOldGen:176749K-> 38591K(174784K)] 177183K-> 38591K(273728K)[PSPermGen:39380K-> 39380K(65536K)], 0.2982459秒] [Tim es:user = 0.30 sys = 0.00,real = 0.30 secs] 21189 INFO | jvm 1 | 2016/02/03 03:15:16 | [全GC [PSYoungGen: 2873K-> 0K(125696K)] [PSOldGen:171318K-> 33804K(174784K)] 174191K-> 33804K(300480K)[PSPermGen:39940K-> 38366K(65536K)], 0.3317803秒] [Times:user = 0.34 sys = 0.00,real = 0.34 secs] 47151 INFO | jvm 1 | 2016/02/03 12:16:51 | [全GC [PSYoungGen: 1406K-> 0K(171776K)] [PSOldGen:174936K-> 38003K(174784K)] 176342K-> 38003K(346560K)[PSPermGen:38642K-> 38642K(65536K)], 0.2988259秒] [时间:用户= 0.30 sys = 0.00,实际= 0.30秒]

我在Windows 2003 x86上运行Java 6更新45,大约有8GB和4个CPU。磁盘空间绰绰有余。我们配置JVM,初始堆内存为256 MB,最大内存为512 MB。该应用程序通过Tanuki Wrapper作为Windows服务运行。

目前看起来好像很长的GC暂停是由于内存,CPU,磁盘空间等原因造成的。我在这里错过了什么?

+1

如果JVM进程开始交换,则可能会发生这种情况。 – apangin

+0

@apangin感谢您的建议。我如何判断JVM进程是否确实交换了?它看起来不像JVM或OS上的内存有问题。有什么办法可以模拟这个吗? –

+0

您可以使用'PerfMon'来监控交换。虽然每个进程页面文件的使用没有单个计数器,但交换活动可以通过'Memory:Pages/sec','Process:Page Faults','Process:I/O bytes'计数器的组合来检测。 – apangin

回答