【发布时间】:2021-09-19 05:52:34
【问题描述】:
我想了解一下 Java java.lang.ref.Finalizer 初始化过程,所以我在它的类静态块上设置了一个断点:
static {
-> ThreadGroup tg = Thread.currentThread().getThreadGroup(); // breakpoint set on this line
for (ThreadGroup tgn = tg;
tgn != null;
tg = tgn, tgn = tg.getParent());
Thread finalizer = new FinalizerThread(tg);
finalizer.setPriority(Thread.MAX_PRIORITY - 2);
finalizer.setDaemon(true);
finalizer.start();
}
然后通过 IntelliJ IDEA 调试按钮启动一个空的main() 方法,但是断点永远不会停止程序(JVM 只是执行到结束并退出。)
Java 版本:
openjdk version "1.8.0_302"
OpenJDK Runtime Environment Corretto-8.302.08.1 (build 1.8.0_302-b08)
OpenJDK 64-Bit Server VM Corretto-8.302.08.1 (build 25.302-b08, mixed mode)
为什么这个断点不生效?
【问题讨论】:
-
因为没有引用
Finalizer所以类从未初始化。 -
在 Intellij 和 jdb 中测试后。我发现即使我们引用了
Finalizer,它也不会在静态块处中断,因为在主方法执行之前加载了Finalizer。 @guaner,调试Finalizer的主要目的是什么? -
@user207421 我确定
Finalizer已被初始化,因为空的main()线程上的断点停止并且jstack显示有一个FinalizerThread线程等待完成其工作。 -
@samabcde 我正在阅读
Finalizer代码以更深入地了解JVM 的finalize()机制。然后我想也许一步一步的调试有助于更顺利地理解它,所以我只是尝试了。但不幸的是,它并没有停止...... -
当我使用
-verbose:class运行一个空类时,Finalizer类是要报告的第 38 个类,在主类之前加载的 400 多个类中。显然,这还为时过早,而且可能还为时过早,无法调试。