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

标签 java winapi memory-leaks

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

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

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

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

  1. 向 native 代码发出信号以进行清理。
  2. 停止 http 服务器(ReSTLet + Simple)
  3. 调用 System.exit(0)

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

但这只是一个例子,有大量已提交的未释放内存,并且无法确定哪些是故意留下来供操作系统释放的,哪些是泄漏。现在,我不怪罪Java,这些泄漏可能是我们做错了什么的结果。我不知道。

重要说明。我并不是在谈论进程生命周期内的清理工作。 SO 处理这个问题有一些问题,但没有一个与我的相关。我希望 Java 在退出时进行清理,以查看真正泄漏了多少内存。

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

最佳答案

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

对于 JNI 泄漏(我根据经验编写),您需要确保您的 native 代码可以在 Java 之外进行测试,以便 Java 内特定链接的潜力很小,仔细阅读就可以处理。或者与橡皮鸭交谈。

关于java - 如何让Java在System.exit(0)时释放所有内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14082619/

相关文章:

ios - iphone 应用程序中的内存泄漏 sqlite3MemMalloc

c++ - 使用 Boost 时的内存泄漏检测

java - JSF : How put onfocus, 输入字段中的模糊效果?

java - 如果 JUnit 测试在没有 @RunWith 注释的情况下也能按预期工作,为什么还要向我的 JUnit 测试添加 @RunWith 注释呢?

c++ - 如何使用 WaitForMultipleObjects 来平衡竞争工作?

c++ - DirectX pEnum->Next(1,&pPin,NULL) 返回 S_FALSE

c++ - 为什么动态内存在超出范围时不被清理

java - 如何匹配BufferedImage和Mat的颜色模型?

java - 错误 - java 中的 "array required, but LinkedList<LLObj> found"

c++ - GetProcessMemoryInfo 错误