Java addShutDownHook内存泄漏

Java addShutDownHook内存泄漏,java,memory-leaks,jakarta-ee,Java,Memory Leaks,Jakarta Ee,在我们的web应用程序中,我们使用Launcher调用一些命令行函数(不是我的主意)并查看结果。这或多或少就是我们所做的: ClassWorld classWorld = new ClassWorld("plexus.core", Thread.currentThread().getContextClassLoader()); Launcher launch = new Launcher(); launch.setWorld(classWorld); result = launch.mainWi

在我们的web应用程序中,我们使用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
,并且在服务器启动时不会破坏对象(大部分时间都是这样)。所以我们的web应用程序突然抛出的每一条命令行都会在服务器中保留在内存中,从不清理

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

有人知道我在哪里可以找到开发这个的信息吗?我不是要求你发布一些解决问题的代码(虽然这会很好),而是指给我一些页面或手册,我可以找到解决这个问题的信息。时间还不是一个大问题(我可能有一周左右的时间来找到并解决这个问题),这样我就可以花些时间阅读手册之类的东西(并在下次学习如何做)

任何帮助都将不胜感激。
谢谢!

Yes
addShutdownHook
泄漏非常严重。您必须使用
removeShutdownHook
,即使这样,线程组也可能由于错误而泄漏

事实上,web应用程序根本不应该接触线程,除非:你已经很好地适应了服务器,并且有足够的技能正确地生成、加入和杀死线程

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


我的建议是:从web应用程序中提取服务并进行相应的处理。编写不存在漏洞的中间件需要相当多的技巧和耐心。

感谢您的回复。不过,我不知道我是否有权更改此响应。如果我必须扰乱服务器线程,还有其他响应吗?再次感谢。@Random,如果您必须的话混乱的线程,你必须做得对,也就是说,确保在web应用程序即将取消部署(停止)时所有线程都已停止,我建议你在指定的线程组中创建所有线程,以便更容易跟踪它们(如果需要,也强制停止)谢谢你的帮助。我想我会接受你的第一个建议,并从web应用程序中获得这项服务。希望老板们这么看,但苏在这方面帮不了我。@Random,但苏在这方面帮不了我,嗯,为什么不呢?带他去脱衣舞俱乐部,总是有效:)