未接收任何请求的Quarkus Rest服务堆内存持续增长是否正常
结论
你描述的现象在当前技术栈下大概率属于正常情况,无需过度担心,核心原因如下:
内存持续上涨的常见合理原因
- 已安装组件的延后初始化逻辑
你启用的smallrye-openapi、swagger-ui组件会在服务启动后异步预加载接口元数据、静态资源索引结构,就算没有外部请求触发,内部初始化任务也会逐步分配堆内存完成预热;agroal数据库连接池默认会运行后台定时任务做连接存活检测、连接数动态调整,执行过程中会产生大量临时对象;hibernate-orm也会在启动后异步完成实体元数据二次校验、查询计划缓存预热,这些逻辑都不会集中在启动阶段完成,所以启动后30分钟内仍有内存分配动作非常正常。 - JVM默认内存管理策略
如果你启动时没有指定固定堆大小参数-Xmx/-Xms,JVM会默认根据宿主机可用内存动态调整堆扩容阈值,优先将空闲内存划归堆空间预留,只有触发GC时才会释放未使用的预留内存,表现出来就是堆占用持续上涨、GC后快速回落、之后再次上涨的走势。此外JVM启动后持续运行的JIT即时编译动作,也会产生临时对象推高堆占用。
异常排查验证方法
如果想要确认不存在内存泄漏,可以按以下方式验证:
- 观察FullGC后的内存基线:如果每次FullGC后的最低堆占用值保持稳定,没有逐次上涨的趋势,就完全排除内存泄漏风险
- 启动时添加固定堆参数测试:添加
-Xmx256m -Xms256m启动参数固定堆大小,如果服务正常运行没有OOM报错,就说明之前的500MB占用是JVM主动扩容的结果,不是异常 - 如需降低闲置内存占用,可按需调整配置:关闭swagger-ui预加载、拉长agroal连接池检测间隔、限制hibernate查询计划缓存大小都可以明显降低闲置阶段的内存分配频率
内容的提问来源于stack exchange,提问作者AVM
相关产品推荐
相关产品推荐

