意外调用 Finalizer::register

问题描述 投票:0回答:1

查看 JVM 服务的堆转储(使用 IntelliJ 的 Profiler),我在

java.lang.ref.Finalizer
中看到以下内容:

这条消息的含义是什么?

unexpected call to Finalizer::register when finalization is disabled

Finalizer
下的大多数参考对象都是Postgres连接。该服务在低负载下进行简单的 SELECT 调用,但内存不断单调增长。这是否确实意味着
--finalization=disabled
作为 JVM 选项传递? (我无法控制这个环境中的那些。)

java jvm heap-dump finalizer
1个回答
0
投票

这确实意味着

--finalization=disabled
作为 JVM 选项传递吗?

不。您在堆转储中看到的字符串只是已加载类的常量池中的某个字符串。它驻留在那里,因为该字符串存在于 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 永远不会调用此方法。

因此,堆转储中该字符串的存在与您观察到的内存泄漏无关。

© www.soinside.com 2019 - 2024. All rights reserved.