2009-06-11 15 views
2

Eclipseプラグインがあり、Jacobを使用してCOMコンポーネントに接続しています。しかし、プラグインを完全に終了すると、Windowsプロセスで.exeファイルがぶら下がってしまいます。JACOBはオブジェクトを正しく解放しません

私はComThread.InitMTA(true)を初期化に使用し、アプリケーションを閉じる前に作成したすべてのCOMオブジェクトに対してSafeRelease()が呼び出されていることを確認し、最後にComThread.Release()を呼び出します。

私は何かを元に戻しますか?

答えて

4

TD2JIRAコンバータでも同じ問題がありました。最終的にオブジェクトを解放するためにJacobファイルの1つにパッチを当てなければなりませんでした。その後、すべてがスムーズになりました。

私のクライアントのログアウトのコードは、()メソッドは、次のようになります。

try { 
    Class rot = ROT.class; 
    Method clear = rot.getDeclaredMethod("clearObjects", new Class[]{}); 
    clear.setAccessible(true); 
    clear.invoke(null, new Object[]{}); 
} catch(Exception ex) { 
    ex.printStackTrace(); 
} 

ROTクラスは、最初にAFAIRアクセスできませんでした。

更新

ヤコブにリソースを解放するための正しい方法は、しかし

ComThread.InitSTA(); // or ComThread.InitMTA() 
... 
ComThread.Release(); 

悪いことを呼び出すことで、時にはそれは助けにはならないということです。 Jacobがネイティブメソッドrelease()を呼び出すにもかかわらず、メモリー(JavaメモリーではなくJVMプロセスメモリー)が制御不能に増加します。

+0

フィードバックに感謝します。 テストアプリを使用しましたが、テストアプリの終了直後に.exeが閉じられました。Jacobの場合、あなたのソリューションは動作しているように見えますが、5分以内に.exeが削除され、その間にタスクマネージャのメモリ使用量の変化は見られません。多分ヤコブの問題? – Gorro

+0

私は解決策が直感に基づいていることを認めなければなりません(多くの試行の後に)、私はそれをサポートしたり説明している知識がありません。 : –

+0

どのようにjacobファイルを修正しましたか?覚えていますか? – rogerdpack

5

さらにいくつかの提案:例外がスローされた場合

  1. 移動finallyブロックにComThread.Release()への呼び出しは、それ以外のスレッドは、添付されたままになります。

  2. COMオブジェクトを使用するすべてのスレッドで、ComThread.InitMTAComThread.Releaseを呼び出していることを確認してください。ワーカースレッドでこれを行うことを忘れた場合、そのスレッドは自動的に接続され、分離されることはありません。

  3. InitSTAを避け、InitMTAに固執する。 COMを使用しているスレッドが1つしかない場合でも、私はInitSTAが薄れていることがわかりました。私はJACOBの内部マーシャリング機構の仕組みがわかりませんが、有効と思われる "ゴースト"オブジェクトで終わってしまっていますが、メソッドが呼び出されたときは何もしません。

幸いにも私はまだJACOBライブラリのコードを変更する必要はありません。

+1

InitMTAと正しい開閉シーケンスでも、メモリがかなり消費されていることがわかりました。 DCOM通信を使用して、テキストプロトコルを使用して話してください。特定の通話回数が過ぎたら、私は無慈悲にそれを殺して再開します。 –

6

私はこの問題に直面しました。 initMTA、などで混乱した後。私は、簡単な修正を発見した - あなたは、Javaを起動するときに追加するには、コマンドラインに次のよう -Dcom.jacob.autogc =真

このROTクラスは代わりにHashMapののWeakHashMapを使用するようになり、それが問題を解決します。

また、-Dcom.jacob.debug = trueを使用すると、多くの有益なデバッグを表示し、ROTマップのサイズを見ることができます。

関連する問題