gpt4 book ai didi

java - 如何诊断 Java 中孤立线程的来源?

转载 作者:行者123 更新时间:2023-11-30 11:25:37 24 4
gpt4 key购买 nike

我正在使用 Java 和 Xuggler 库编写一个视频分析软件。我的代码都是单线程的,但其中一些是从 Xuggler 线程调用的。

我必须处理一个充满视频文件的目录,因此我遍历文件并为每个文件启动一个 IMediaReader 实例,然后处理帧。完成后,我分离监听器并关闭读取器。像这样:

public void ProcessFrames(VideoFile file, MediaProcessor processor, int ImageType) 
{
IMediaReader mediaReader = ToolFactory.makeReader(file.location);
mediaReader.setBufferedImageTypeToGenerate(ImageType);

mediaReader.addListener(processor);
mediaReader.open();
IError videoDecodeError = null;
while (videoDecodeError == null &&
processor.isListenerFinishedWithStream() == false)
{
try {
videoDecodeError = mediaReader.readPacket();
} catch(Exception ex) {
ex.printStackTrace();
}
}

System.out.println("Closing media reader.");
mediaReader.close();
mediaReader.removeListener(processor);
}

我注意到,每次我创建一个新的 IMediaReader 时,它似乎都会留下一个线程打开并且只是闲逛。问题是我似乎无法找到有关孤立线程的任何信息。在 Eclipse 中,它们显示为“Thread [Thread-2] (Running)”。

我找不到任何关于线程卡住位置的信息,或者它是从什么开始产生的。我附加了 VisualVM 以查看它是否会告诉我发生了什么。该图提供了很多信息,但它没有回答我的问题:

VisualVM showing thread leak

VisualVM 显示正在创建的线程,但它们从未关闭。 Eclipse 或 VisualVM 都没有告诉我有关线程创建位置或线程正在执行的操作的任何信息。

如何确定线程的创建位置?我如何防止他们像这样成为孤儿?

非常感谢!

编辑:我在暂停应用程序时添加了 Eclipse 线程树的屏幕截图。

Eclipse threads window

最佳答案

单击 Eclipse 调试器中的暂停按钮,然后展开感兴趣的线程以查看它们在那个时间点正在做什么。

或者(这不需要调试器,甚至不需要运行的进程)使用 JDK 中的 jstack 实用程序。

当然,堆栈跟踪不会跨越线程边界——它们不会向您显示是什么产生了一个线程。但它们可能会有所帮助。

如果他们不这样做,要找出什么是生成线程,您可以在 java.lang.Thread.start() 上放置一个断点。

关于java - 如何诊断 Java 中孤立线程的来源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20229221/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com