我们的应用程序是 Java 和本机代码的混合体。它会泄漏内存。
最可能的原因是本机代码,并且确实存在泄漏,但是,它们似乎并不是唯一的贡献者。
无论如何,我使用本地分析器来分析应用程序,使用我在本地构建的 OpenJDK 6,因此我有 Java 本身的完整源代码和完整符号。
方法很简单——我运行应用程序,然后在某个时候我发出信号让它优雅地终止。优雅终止包括三个步骤:
- 发信号通知本机代码进行清理。
- 停止 http 服务器(Restlet + 简单)
- 调用 System.exit(0)
显然,Java 严重依赖操作系统来释放它占用的内存,因为我可以看到多次调用 VirtualAlloc 来保留一些内存,但它永远不会被保留。
但这只是一个例子,有大量已提交的未释放内存,无法确定操作系统有意释放的内容以及泄漏的内容。现在,我不怪 Java,这些泄漏可能是我们做错了的结果。我不知道。
一个重要的说明。我不是在谈论在该过程的生命周期内进行清理。有关于 SO 处理它的问题,它们都与我的无关。我希望 Java 在退出时进行清理,以查看真正泄漏了多少内存。
那么,有没有办法告诉 Java 在退出时进行清理以使这种事后泄漏分析可行?