2014-01-24 40 views
0

我有一個Java項目,通過COM與一個DLL庫工作。我有Windows 7,我使用32位Java 1.6。我使用2012年4月26日發佈的com4j作爲橋樑。有用。與DirectByteBuffer,清潔,終結者,變種實例Com4j泄漏

問題是我有一個嚴重的內存泄漏,這使得我的程序幾乎不可能運行。

我訂閱了一些COM事件。當下一個事件到達時,我觀察到使用的堆內存的增加,而GC從不幫助減少它。如果我使用COM4J.cleanUp() - 內存使用停止增長,但事件不再發生。我的程序使用的堆內存非常快,而實際上沒有分配我自己的對象。在VisualVM的

快照差異:http://postimg.org/image/cxg77ft8j/

堆內存籌集的VisualVM:http://postimg.org/image/m52g63b51/

貌似問題是DirectByteBuffer,清潔劑,變體和釋放的情況。我不會自己創造它們。這是com4j裏面的東西。

有什麼建議嗎?

回答

1

我正在調查我正在研究的com4j項目中的內存泄漏問題。 據我所知,Com4j爲使用Com4j的每個JavaThread啓動一個ComThread。所有對Com4j的調用都作爲該線程的任務執行。當線程存在時,資源將被釋放,並且所有COM-Wrappers都將被關閉。當然,COM4J.cleanUp()實際上會殺死當前Java線程的ComThread,這就解釋了爲什麼你聽的事件停止了。

我在我的項目中看到了相同的行爲:ComThread運行的時間越長,使用的堆越多,永遠不會釋放。當處理Com4j包裝器時,它們不會從堆中移除,因爲它們保留在ComThread的活動對象集中。

看看https://github.com/guykv/com4j/compare/Issue16。將這個改變合併到我的com4j分支中確實幫助Heap保持穩定。

Cheears。

+0

非常感謝,無光澤!我很高興這個項目還活着。 – MiamiBeach

+0

我用以下Maven的依賴: org.jvnet.com4j com4j 20120426-2 看起來是過時? 你能告訴我你是如何得到你的穩定版本的com4j:哪個maven artefact從哪個repo中使用過,以及你在哪裏合併過的? – MiamiBeach

+0

現在我用一種非常奇怪的方式解決我的問題:我只是停用舊的COM對象,並在每15分鐘重新創建一次:)偵聽器斷開GC成功後。 – MiamiBeach