启动Grails 3.3.9应用时遭遇Unable to start embedded Tomcat异常
问题分析与修复方案
核心问题定位
多次触发OutOfMemoryError: GC overhead limit exceeded后,Ehcache的磁盘缓存文件大概率已损坏,导致重启时reportCache初始化失败,进而触发Spring Bean依赖链创建异常,最终引发Unable to start embedded Tomcat错误。
具体修复步骤
- 清理Ehcache磁盘缓存
Grails 3.3.9中Ehcache默认磁盘缓存路径通常为build/tmp/ehcache或用户主目录下的~/.grails/ehcache,直接删除对应目录下的全部文件,重点清除reportCache相关缓存文件。 - 调整JVM内存参数
针对之前的内存溢出问题,修改启动参数增大堆内存与元空间:
若使用IDEA启动,可在Run Configuration中直接添加上述参数,避免再次触发GC过载。export JAVA_OPTS="-Xms2g -Xmx4g -XX:MaxMetaspaceSize=512m" - 检查Ehcache配置合理性
打开grails-app/conf/ehcache.xml或application.yml,确认reportCache的配置项是否存在磁盘存储上限过小等问题:
确保示例配置检查点:
<cache name="reportCache" maxEntriesLocalHeap="10000" maxEntriesLocalDisk="1000000" diskExpiryThreadIntervalSeconds="3600" memoryStoreEvictionPolicy="LRU"> </cache>maxEntriesLocalDisk数值及缓存目录所在磁盘有足够剩余空间。 - 彻底清理项目构建缓存
执行Grails清理命令清除旧构建缓存:./grailsw clean ./grailsw compile
验证流程
- 完成上述操作后重新启动应用;
- 观察启动日志,确认
reportCache初始化成功、Tomcat正常启动; - 测试大计算场景,验证内存参数是否能支撑业务需求,避免再次出现OOM。
内容的提问来源于stack exchange,提问作者anonimos
相关产品推荐
相关产品推荐

