1

我们的应用程序是 Java 和本机代码的混合体。它会泄漏内存。

最可能的原因是本机代码,并且确实存在泄漏,但是,它们似乎并不是唯一的贡献者。

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

方法很简单——我运行应用程序,然后在某个时候我发出信号让它优雅地终止。优雅终止包括三个步骤:

  1. 发信号通知本机代码进行清理。
  2. 停止 http 服务器(Restlet + 简单)
  3. 调用 System.exit(0)

显然,Java 严重依赖操作系统来释放它占用的内存,因为我可以看到多次调用 VirtualAlloc 来保留一些内存,但它永远不会被保留。

但这只是一个例子,有大量已提交的未释放内存,无法确定操作系统有意释放的内容以及泄漏的内容。现在,我不怪 Java,这些泄漏可能是我们做错了的结果。我不知道。

一个重要的说明。我不是在谈论在该过程的生命周期内进行清理。有关于 SO 处理它的问题,它们都与我的无关。我希望 Java 在退出时进行清理,以查看真正泄漏了多少内存。

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

4

1 回答 1

0

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

对于 JNI 泄漏,(我是根据经验写的),您需要确保您的本机代码可以在java 之外进行测试,这样特定于 Java 的链接的可能性很小,您可以小心处理阅读。或与橡皮鸭交谈。

于 2012-12-29T14:39:03.353 回答