Com4j泄漏了DirectByteBuffer,Cleaner,Finalizer,Variant实例

时间:2014-01-24 18:46:12

标签: java memory-leaks garbage-collection com4j

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

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

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

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

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

看起来问题出在DirectByteBuffer,Cleaner,Variant和Finalizer实例上。我不是自己创造的。这是com4j中的内容。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

我正在调查我正在研究的com4j项目中的内存泄漏。 据我所知,Com4j为每个使用Com4j的JavaThread启动了一个ComThread。对Com4j的所有调用都作为该线程的任务执行。当Thread存在时,将释放资源并关闭所有COM-Wrappers。 COM4J.cleanUp()实际上杀死了当前Java Thread的ComThread,这解释了为什么你听的事件不再来了。

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

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

Cheears。