几天前,我们从 Ubuntu 16LTS 升级到了 Ubuntu 18LTS,从那时起,Apache Tomcat 彻底崩溃了两次(每天一次,间隔约 25 小时)。java 进程停止运行。
此时日志文件中添加了一行:
free(): corrupted unsorted chunks
(就是这样——没有时间戳)
它似乎与服务器上当时发生的任何特定操作无关,至少仅凭两个实例很难判断,但我怀疑它可能与垃圾收集有关。这是因为服务器监控显示,java 进程的内存使用量在一分钟内从 7.90GB 下降到 0.93GB(实际上 java 进程退出了,所以在我手动重启 tomcat 之后,内存使用量可能变小了)。服务器的最大内存设置 -Xmmx 设置为 8GB,在崩溃之前,它在一天中逐渐上升到略低于该值。
此外,tomcat 日志的第一行是
NOTE: Picked up JDK_JAVA_OPTIONS: --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED
OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.
我/etc/default/tomcat8
有
JAVA_OPTS="-Djava.awt.headless=true -Xmx8g -XX:+UseConcMarkSweepGC"
Ubuntu 16 上重新添加了 UseConcMarkSweepGC 选项,当时使用了 tomcat7,我似乎记得它是推荐的。事实上,配置文件仍然显示
'Use "-XX:+UseConcMarkSweepGC" to enable the CMS garbage collector (improved response time)
无论如何,我现在已经将其删除,希望这就是问题所在。我们将看看明天是否会发生崩溃,但与此同时,这看起来合理吗?有人可以建议任何步骤来验证这个假设或进一步调试,或者对可能发生的情况有任何其他想法吗?
答案1
万一其他人也遇到这个问题,多亏了 java-core-libs 邮件列表,我发现原因是 Tomcat 中使用了 APR/native 库。卸载这些库(apt-get remove libapr1)并从 server.xml 中删除配置引用解决了这个问题