Pergunta

Eu tenho um plugin do eclipse, que se conecta a um componente COM usando Jacob. Mas depois que eu fechar o plugin inteiramente, as estadias arquivo .exe pendurado em processos do Windows.

Eu uso ComThread.InitMTA(true) para inicialização e certifique-se de que SafeRelease() é chamado para cada objeto COM Eu criei antes de fechar o aplicativo e eu chamo ComThread.Release() no final.

Do I deixar algo por fazer?

Foi útil?

Solução

tive o mesmo problema com o conversor TD2JIRA. Eventualmente teve que corrigir um dos arquivos de Jacob para liberar os objetos. Depois que tudo correu suave.

O código na minha Sair do cliente () método agora se parece com isso:

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();
}

A classe ROT não era acessível inicialmente, AFAIR.

Atualizar

A maneira correta de liberar recursos em Jacob é chamar

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

coisa ruim é que embora às vezes não ajuda. Apesar de Jacob chama liberação método nativo (), a memória (nem mesmo a memória Java, mas a memória processo JVM) cresce descontroladamente.

Outras dicas

Algumas outras sugestões:

  1. mover a chamada para ComThread.Release() em um bloco finally, caso contrário, o fio vai permanecer ligado se uma exceção é lançada.

  2. Verifique se você está chamando ComThread.InitMTA e ComThread.Release em cada segmento que usa um objeto COM. Se você esquecer de fazer isso em um segmento de trabalho, em seguida, esse segmento será anexado automaticamente e nunca separada.

  3. Evite InitSTA e vara para InitMTA. Mesmo quando há apenas um segmento usando COM, eu descobri InitSTA ser esquisito. Eu não sei como mecanismo de triagem interna da JACOB obras, mas eu acabei com objetos "fantasmas" que parecem ser válido, mas não fazem nada quando seus métodos são chamados.

Felizmente eu nunca ainda necessário modificar qualquer código na biblioteca JACOB.

Eu corri para este problema sozinho. Depois de mexer com initMTA, etc. Eu encontrei uma solução simples - quando você começa Java adicione o seguinte à sua linha de comando: -Dcom.jacob.autogc = true

Isto fará com que a classe ROT usar um WeakHashMap em vez de um HashMap e que resolve o problema.

Você também pode usar -Dcom.jacob.debug = true para ver lotes de spew depuração informativo e ver o tamanho do mapa ROT.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top