Pregunta

Tengo un plugin de Eclipse, que se conecta a un componente COM utilizando Jacob. Sin embargo, después de cerrar el plugin en su totalidad, el archivo .exe se queda colgando en los procesos de Windows.

Yo uso ComThread.InitMTA(true) para la inicialización y asegúrese de que SafeRelease() se llama para cada objeto COM creé antes de cerrar la aplicación y que llamo ComThread.Release() al final.

¿Me dejo algo sin hacer?

¿Fue útil?

Solución

tenía el mismo problema con convertidor TD2JIRA. Finalmente, tuvo que remendar uno de los archivos de Jacob para liberar los objetos. Después de que todo fue sin problemas.

Método

El código de cierre de sesión en mi cliente () ahora se ve así:

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

La clase ROT no era accesible al principio, AFAIR.

Actualizar

La forma correcta para liberar recursos en Jacob es llamar

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

Lo malo es que aunque a veces no ayuda. A pesar de Jacob llama liberación método nativo (), la memoria (ni siquiera la memoria de Java, pero la memoria de procesos JVM) crece sin control.

Otros consejos

Algunas sugerencias adicionales:

  1. Mover la llamada a ComThread.Release() en un bloque finally, de lo contrario el hilo permanecerá unido si se produce una excepción.

  2. Compruebe que está llamando ComThread.InitMTA y ComThread.Release en todos los hilos que utiliza un objeto COM. Si se olvida de hacer esto en un subproceso de trabajo luego de que el hilo se conectará automáticamente y nunca separado.

  3. Evitar InitSTA y se adhieren a InitMTA. Incluso cuando sólo hay un hilo mediante COM, he encontrado InitSTA a ser escamosa. No sé cómo funciona el mecanismo de clasificación interna de Jacob, pero he terminado con objetos "fantasma" que parecen ser válidos, pero no hacen nada cuando se invocan sus métodos.

Afortunadamente, sin embargo, nunca he necesitado para modificar cualquier código en la biblioteca JACOB.

Me encontré con este problema a mí mismo. Después de jugar con initMTA, etc. He encontrado una solución simple - cuando se inicia Java añadir lo siguiente a la línea de comandos:    -Dcom.jacob.autogc = true

Esto hará que la clase ROT utilizar un WeakHashMap en lugar de un HashMap y que resuelve el problema.

También puede utilizar -Dcom.jacob.debug = true para ver un montón de depuración informativo vomitan y ver el tamaño del mapa ROT.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top