0

我有一个 Java 项目,它通过 COM 与一个 dll 库一起工作。我有 Windows 7,我使用 32 位 Java 1.6。我使用 com4j 的 2012/04/26 版本作为桥梁。有用。

问题是我有一个严重的内存泄漏,这使得我的程序几乎不可能运行。

我订阅了一些 COM 事件。当下一个事件到来时,我观察到堆内存使用的增加,而 GC 从来没有帮助减少它。如果我使用 COM4J.cleanUp() - 内存使用停止增长,但事件不再到达。我的程序使用的堆内存增长得非常快,而实际上没有分配我自己的对象。

VisualVM 中的快照差异:http: //postimg.org/image/cxg77ft8j/

VisualVM 中的堆内存增加:http: //postimg.org/image/m52g63b51/

看起来问题出在 DirectByteBuffer、Cleaner、Variant 和 Finalizer 实例上。我不是自己创造它们的。这是 com4j 内部的东西。

有什么建议么?

4

1 回答 1

1

我正在调查我正在从事的 com4j 项目中的内存泄漏。据我了解,Com4j 为每个使用 Com4j 的 JavaThread 启动一个 ComThread。所有对 Com4j 的调用都作为该线程的任务执行。当 Thread 存在时,资源被释放,所有 COM-Wrapper 都被释放。COM4J.cleanUp() 实际上杀死了当前 Java 线程的 ComThread,这解释了为什么您收听的事件停止出现。

我在我的项目中看到了相同的行为:ComThread 运行的时间越长,使用的堆就越多,而且从未被释放。当 Com4j 包装器被释放时,它们不会从堆中删除,因为它们保留在 ComThread 的活动对象集中。

看看https://github.com/guykv/com4j/compare/Issue16。将该更改合并到我的 com4j 分支实际上有助于堆保持稳定。

干杯。

于 2014-02-03T17:08:47.477 回答