内存泄漏与addShutDownHook

时间:2011-06-17 11:22:47

标签: java memory-leaks java-ee

在我们的网络应用程序中,我们使用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 1}}并且它不会在服务器启动时(主要是所有时间)销毁对象。因此,我们的网络应用程序抛出的每一个命令行都会在服务器中记忆,从不清理。

所以,我被告知我应该在waitFor中查找我的进程并从ShutdownHook中退出。看到我的代码,最后这样做似乎很复杂,因为我没有直接调用CommandLineUtils(我想它是在启动方法中调用的)。

有没有人知道我可以在哪里找到开发此信息的信息?我不是要求你发布一些解决问题的代码(尽管它会很棒),但是要指出一些页面或手册,​​我可以找到解决这个问题的信息。时间不是一个大问题(我可能需要一周时间才能找到并解决这个问题),所以我可以花一些时间阅读手册等(并在下次学习如何操作)。

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

1 个答案:

答案 0 :(得分:2)

addShutdownHook很难,很难。您必须使用removeShutdownHook,即使这样,ThreadGroup也可能因错误而泄漏。

实际上,网络应用程序根本不应该触及线程,除非:您已经很好地与服务器结算并且具有足够的技能来进行线程生成,正确地加入和杀死它。

这意味着你自己有很多技能来编写中间件,而且很可能你将所需的线程代码单独部署为JMX或JCA。

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