You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JVM堆dump中Finalizer注册异常含义及内存增长问题咨询

JVM Finalizer报错与内存增长问题解析

报错信息的含义

unexpected call to Finalizer::register when finalization is disabled 的意思很明确:JVM已经禁用了对象终结(finalization)机制,但代码里依然有尝试注册Finalizer的操作。

Finalizer是JVM负责执行对象finalize()方法的核心机制,当这个机制被禁用后,JVM会拒绝任何新的Finalizer注册请求。你看到的Postgres连接对象,本身设计上会依赖finalize()方法作为资源释放的兜底方案——当连接没有被显式关闭时,靠finalize()来归还连接到池里。现在JVM禁用了finalization,这些连接对象尝试注册Finalizer就触发了这个报错。

是否确实是因为--finalization=disabled参数?

是的,大概率是这个参数导致的。这个参数是OpenJDK 17及以上版本新增的,用来彻底关闭finalization机制。

如果你没法直接查看环境的JVM启动参数,可以在IntelliJ的堆dump分析界面里找「VM Arguments」或「System Properties」模块,搜索finalization相关配置就能确认。

内存单调增长的原因

Postgres连接的资源释放本来有两层保障:业务代码显式调用close(),以及兜底的finalize()方法。现在finalization被禁用,一旦有连接没被显式关闭,就没法通过finalize()归还到连接池。这会导致:

  • 连接池里的可用连接不断减少,只能持续创建新连接
  • 未被正确释放的连接对象本身可能无法被正常GC回收(或回收不彻底),堆积在内存里,最终造成内存持续上涨。

无需修改JVM参数的缓解方案

  • 规范连接使用:所有Postgres连接必须放在try-with-resources块中,确保自动关闭;或者在代码里显式调用close(),绝对不要依赖finalize()兜底
  • 调整连接池配置:设置合理的最大连接数上限,缩短连接空闲超时时间,避免无限制创建新连接
  • 升级JDBC驱动:新版本的Postgres JDBC驱动已经弱化了对finalize()的依赖,改用更可靠的资源回收方式

内容的提问来源于stack exchange,提问作者silverberry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 04:48:27