我们的系统中经常发生 FULL GC。我们正在使用在 Tomcat 服务器上运行的 Java 应用程序。我们的应用程序正在使用内部负载平衡器设置运行。我们在服务器日志中看到很多 Full GC,导致应用程序挂起并发生代理错误。
我们使用的 Java 参数值是:Webapp 包装器:wrapper.java.additional.4=-Xms382M wrapper.java.additional.5=-Xmx1024M Backapp 包装器:wrapper.java.additional.4=-Xms382M wrapper.java.additional.5=-Xmx1024M
webapp wrapper 日志中发现的错误: INFO | jvm 1 | 2010/11/26 09:33:19 | [PSYoungGen: 1398460K->140291K(1514624K)] 4623364K->3491394K(5009920K), 0.7285303 秒] [Times: user=1.42 sys=0.00, real=0.72 秒] INFO | jvm 1 | 2010/11/26 09:33:19 | 68539.126: [Full GC DEBUG | wrapperp | 2010/11/26 09:33:19 | 发送数据包 PING: ping
尝试更改 JVM 值以增加堆大小。但无济于事。我怀疑除了这些参数之外,可能还有其他原因导致了此问题。
有人能帮我吗?
答案1
在你的 setDomainEnv.sh 中添加此参数:-XX:+DisableExplicitGC
重启服务器。这将避免应用程序可能调用的任何显式 GC,并允许 JVM 内部决定并在真正需要时触发完整 GC。
答案2
将其添加到您的 java_opts:“-XX:+UseConcMarkSweepGC”这是一个多线程 GC,在高负载下工作得更好。
答案3
完整 GC 是垃圾收集过程中的一个重要事件。在此完整 GC 阶段,将从 JVM 堆中的所有区域(年轻、老、永久、元空间)收集垃圾。完整 GC 倾向于从内存中驱逐更多对象,因为它会运行到所有代。完整 GC 事件有多个阶段。完整 GC 事件的某些阶段(如“初始标记”、“重新标记”、“清理”等)会暂停正在运行 JVM 的所有应用程序线程。在此期间,不会处理任何客户事务。JVM 将使用所有 CPU 周期来执行垃圾收集。因此 CPU 消耗会相当高。因此,一般来说,完整 GC 是不可取的。连续的完整 GC 会导致以下问题:
- CPU 消耗将会急剧上升。
- 由于 JVM 暂停,应用程序事务的响应时间将会降低。因此,这将影响您的 SLA 并导致糟糕的客户体验。