我有一个提供在线视频播放服务的 Java 应用程序。当高峰流量到来时(比如用户点击手机推送窗口),GC开销很大,我在GC日志中可以看到“提升失败”和“并发模式失败”的信息,GC很及时消耗,几乎需要10分钟才能完成一个GC周期,这使得应用程序长时间无法响应。
我知道问题应该是内存使用的错误代码设计,任何人都可以帮助弄清楚如何解决 GC 问题吗?谢谢。
这是我的服务器环境:
cat /etc/redhat-release
CentOS release 6.8 (Final)
free -h
total used free shared buffers cached
Mem: 31G 31G 302M 16K 260M 6.5G
-/+ buffers/cache: 24G 7.1G
Swap: 2.0G 564M 1.4G
java -version
java version "1.7.0_131"
OpenJDK Runtime Environment (rhel-2.6.9.0.el6_8-x86_64 u131-b00)
OpenJDK 64-Bit Server VM (build 24.131-b00, mixed mode)
这是我原来的 JVM 设置:
55634 XmlConfiguration -Xmx22528m -Xms22528m -verbose:gc -XX:NewRatio=3
-XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled
-Xloggc:/data/logs/jetty/gc.log -XX:GCLogFileSize=10M -XX:NumberOfGCLogFiles=10
-XX:+UseGCLogFileRotation -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps
-XX:+PrintGCDetails -XX:+DisableExplicitGC -XX:+ScavengeBeforeFullGC
-XX:+CMSScavengeBeforeRemark -XX:+UseCMSInitiatingOccupancyOnly
-XX:CMSInitiatingOccupancyFraction=70
-Djetty.home=/usr/local/jetty-distribution-8.1.16.v20140903
我尝试了一些解决方案,但问题仍然存在。
1) 调整JVM参数:-XX:CMSInitiatingOccupancyFraction=50,使CMS GC更早,为应用程序线程提供更多空闲内存。
2)调整JVM参数:-XX:NewRatio=2,让新生代变大。
3)调整JVM参数:-XX:PermSize=512m,-XX:MaxPermSize=512m,使持久化生成更大。
4) 对单台服务器设置限速器,可以保护下划线应用。
30秒到达战场
一只萌萌小番薯
相关分类