我有一个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内部的东西。

有什么建议么?

最佳答案

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

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

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

芝士。

09-04 13:14