gpt4 book ai didi

java - addShutDownHook 的内存泄漏

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

在我们的网络应用程序中,我们使用 Launcher 调用一些命令行功能(不是我的想法)并查看结果。这或多或少是我们所做的:

ClassWorld classWorld = new ClassWorld("plexus.core", Thread.currentThread().getContextClassLoader());
Launcher launch = new Launcher();
launch.setWorld(classWorld);
result = launch.mainWithExitCode(sArguments);

嗯,我最近了解到,因为 mainWithExitCode 是一个静态函数,所以它可能不会像我想的那样执行。所以下一个版本可能只是:

Launcher launch = new Launcher();
result = launch.mainWithExitCode(sArguments);

所以,我们一直在测试我们的应用程序,它似乎由于很多我并不完全理解的东西而泄漏。所以这里的一位前辈(但不是我们项目的)告诉我们,这可能是由于 CommandLineUtils 使用 addShoutDownHook 来“传输”(这可能不是最好的词) ) 对象到 java.lang.ApplicationShutdownHooks 并且它不会在服务器启动时销毁该对象(大部分时间)。因此,我们的网络应用程序突然抛出的每条命令行都会留在服务器的内存中,永远不会清理。

因此,我被告知我应该在 waitFor 中查找我的进程并从 ShutdownHook 中退出它。看到我的代码,它最终看起来确实很复杂,因为我没有直接调用 CommandLineUtils(我想它是在 launch 方法中调用的)。

有人知道我在哪里可以找到开发这个的信息吗?我不是要您发布一些解决问题的代码(尽管这会很棒),而是要我指向某个页面或手册,​​以便我可以找到解决此问题的信息。时间还不是什么大问题(我大概有一周左右的时间来找出并解决这个问题),所以我可以花一些时间阅读手册之类的(并学习下一次如何做)。

如有任何帮助,我们将不胜感激。谢谢!

最佳答案

是的 addShutdownHook 泄漏非常严重。您必须使用 removeShutdownHook,即使这样 ThreadGroup 也可能会由于错误而泄漏。

实际上,网络应用程序根本不应该接触线程,除非:您已经很好地适应了服务器并且有足够的技能来正确地生成、加入和终止线程。

这意味着您确实具备足够的技能来自己编写中间件,而且您很可能会将所需的线程代码单独部署为 JMX 或 JCA。

我的建议是:从网络应用程序中提取服务并相应地处理它。编写没有泄漏的中间件需要相当多的技巧和耐心。

关于java - addShutDownHook 的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6385018/

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