Payara Glassfish Server重部署列目录错误及GC超限问题求助
Payara热部署问题解决方案
1 偶发NoSuchFileException目录不存在报错修复
该报错属于Payara 5.194版本的已知竞态问题:热部署开启keepstate=true时,DirWatcher目录监控线程会尝试访问刚被旧部署流程删除的generated目录,和权限配置无关。
可选择以下任意一种方案修复:
- 开发环境关闭keepstate选项:部署时指定参数
--keepstate=false,或在domain配置文件中修改默认部署参数,每次重部署清空旧状态数据,避免旧目录删除和新目录创建的时序冲突 - 预创建目标目录:提前手动创建
C:\payara5\glassfish\domains\domain1\generated\ejb\javaProject目录,跳过部署时的删除重建逻辑,从根源避免冲突 - 升级Payara版本:该竞态问题在Payara 5.2020及以上版本已修复,可直接升级小版本解决底层问题
2 GC overhead limit exceeded内存溢出报错修复
该报错是热部署导致的类加载器内存泄漏,每次重部署生成的旧类加载器无法被GC回收,积累到一定阈值就会触发溢出,单纯调大堆内存只会推迟报错时间,无法根治。
修复方案:
- 开启类卸载和泄漏检测:在domain.xml的jvm-config节点添加以下JVM参数:
-XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70 -XX:+CMSClassUnloadingEnabled -XX:+ExplicitGCInvokesConcurrent -Dorg.glassfish.deployment.permanentGenerationsCapacity=500
- 调整自动部署触发逻辑:关闭IDE的实时自动热部署,改为手动触发,或设置自动部署延迟,避免单次修改就触发全量重部署
- 定期重启开发服务器:日常开发过程中每2-3小时手动重启一次Payara,彻底释放泄漏的类加载器内存,避免问题积累
若不想修改配置,可在每次触发目录不存在报错后,执行一次干净的全量重部署,也能暂时避免后续GC溢出问题。
内容的提问来源于stack exchange,提问作者kw88
相关产品推荐
相关产品推荐

