最近一个生产环境变得非常缓慢。进程的CPU占用率达到了200%。但进程仍在不断工作。在我重启服务后,它恢复了正常。我有几个症状: Par Survivor空间堆长时间为空,垃圾收集占用了约20%的CPU时间。
JVM选项:
X:+CMSParallelRemarkEnabled, -XX:+HeapDumpOnOutOfMemoryError, -XX:+UseConcMarkSweepGC, - XX:+UseParNewGC, -XX:HeapDumpPath=heapdump.hprof, -XX:MaxNewSize=700m, -XX:MaxPermSize=786m, -XX:NewSize=700m, -XX:ParallelGCThreads=8, -XX:SurvivorRatio=25, -Xms2048m, -Xmx2048m
Arch amd64
Dispatcher Apache Tomcat
Dispatcher Version 7.0.27
Framework java
Heap initial (MB) 2048.0
Heap max (MB) 2022.125
Java version 1.6.0_35
Log path /opt/newrelic/logs/newrelic_agent.log
OS Linux
Processors 8
System Memory 8177.964, 8178.0
附图中有更多信息。当非堆出现问题时,已使用的代码缓存和已使用的cms perm gen减少了一半。
我从newrelic获取了这些信息。
问题是为什么服务器开始变得如此缓慢。
有时服务器完全停止,但我们发现PDFBox存在问题。上传某些包含某些字体的pdf时会崩溃JVM。
更多信息:我观察到每天Old gen都在填充。现在我每天重启服务器。重启后状态很好,但Old gen会在下一天继续填充,并且服务器会变慢,直到需要重新启动。