我有一个Java项目,通过COM与一个dll库一起工作。我使用的是Windows7,我使用的是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内部的一些东西。
有什么建议吗?
发布于 2014-02-04 01:08:47
我自己正在调查我正在从事的一个com4j项目的内存泄漏。据我所知,Com4j为每个使用Com4j的JavaThread启动一个ComThread。对Com4j的所有调用都作为该线程的任务执行。当线程存在时,资源将被释放,所有COM包装都将被释放。COM4J.cleanUp()实际上杀死了当前Java Thread的ComThread,这解释了为什么您监听的事件不再出现。
我在我的项目中看到了同样的行为: ComThread运行的时间越长,使用的堆就越多,并且永远不会释放。当Com4j包装器被释放时,它们不会从堆中删除,因为它们保留在ComThread的活动对象集中。
看看https://github.com/guykv/com4j/compare/Issue16吧。将更改合并到我的com4j fork实际上帮助堆保持稳定。
切尔斯。
https://stackoverflow.com/questions/21340112
复制相似问题