如何让Java在System.exit(0)上释放所有内存?

时间:2012-12-29 14:32:52

标签: java winapi memory-leaks

我们的应用程序是Java和本机代码的混合体。它泄漏了记忆。

最可能的原因是本机代码,实际上它有泄漏的份额,但是,它们似乎并不是唯一的贡献者。

无论如何,我使用本地分析器配置应用程序,使用我在本地执行的OpenJDK 6的构建,因此我拥有Java本身的完整源代码和完整符号。

方法很简单 - 我运行应用程序,然后在某些时候我发信号通知优雅终止。优雅的终止包括三个步骤:

  1. 发信号通知本地代码以进行清理。
  2. 停止http服务器(Restlet + Simple)
  3. 调用System.exit(0)
  4. 显然,Java在很大程度上依赖操作系统来释放它占用的内存,因为我可以看到几次调用VirtualAlloc来保留一些内存,但它永远不会毫无保留。

    但这仅仅是一个例子,有大量未提交的未释放内存,并且没有办法确定操作系统发布时留下的内容以及泄漏情况。现在,我不怪Java,这些泄漏可能是我们做错事的结果。我不知道。

    重要提示。我不是在谈论在整个过程中进行清理。有关SO的问题有待处理,并且没有一个与我的相关。我希望Java在退出时清理,以查看真正泄漏的内存量。

    那么,有没有办法告诉Java在退出时进行清理以使这个事后漏洞分析成为可能?

1 个答案:

答案 0 :(得分:0)

如果您通过保留引用泄漏java对象,那么一个好的java分析器(例如YourKit或JProfiler)将直接告诉您。这将回答您关于非JNI泄漏的问题。

对于JNI泄漏,(我从经验中写),您需要确保您的本机代码可以在之外进行测试,以便特定于Java的链接的潜在可能性小,你可以通过仔细阅读来处理它。或者和橡皮鸭说话。