查看 JVM 服务的堆转储(使用 IntelliJ 的 Profiler),我在
java.lang.ref.Finalizer
中看到以下内容:
这条消息的含义是什么?
unexpected call to Finalizer::register when finalization is disabled
Finalizer
下的大多数参考对象都是Postgres连接。该服务在低负载下进行简单的 SELECT 调用,但内存不断单调增长。这是否确实意味着 --finalization=disabled
作为 JVM 选项传递? (我无法控制这个环境中的那些。)
这确实意味着
作为 JVM 选项传递吗?--finalization=disabled
不。您在堆转储中看到的字符串只是已加载类的常量池中的某个字符串。它驻留在那里,因为该字符串存在于 java.lang.ref.Finalizer
类的
源代码中:
static void register(Object finalizee) {
if (ENABLED) {
new Finalizer(finalizee);
} else {
throw new InternalError("unexpected call to Finalizer::register when finalization is disabled");
}
}
并且相应的常量池条目已解决 - 请注意屏幕截图上的
<resolved_references>
。
即使这行代码从未被执行过,该字符串也可能由于多种原因而被解析,例如,如果启用了类数据共享,或者该方法很热并且已经过 JIT 编译。
实际上,这一行更像是一个断言 - 如果禁用终结,JVM 永远不会调用此方法。
因此,堆转储中该字符串的存在与您观察到的内存泄漏无关。