문제

Jacob을 사용하여 COM 구성 요소에 연결되는 Eclipse 플러그인이 있습니다. 그러나 플러그인을 완전히 닫은 후 .exe 파일은 Windows 프로세스에 매달려 있습니다.

나는 사용한다 ComThread.InitMTA(true) 초기화를 위해 SafeRelease() 앱을 닫기 전에 내가 만든 모든 com 객체에 대해 호출되며 ComThread.Release() 끝에.

내가 뭔가 취소 한 것을 남겨 두나요?

도움이 되었습니까?

해결책

TD2JIRA 변환기에서도 같은 문제가있었습니다. 결국 객체를 해제하기 위해 야곱 파일 중 하나를 패치해야했습니다. 그 후 모든 것이 순조롭게 진행되었습니다.

내 클라이언트 로그 아웃 () 메소드의 코드는 이제 다음과 같습니다.

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 클래스는 처음에는 액세스 할 수 없었습니다.

업데이트

야곱에서 자원을 공개하는 올바른 방법은

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

그러나 나쁜 것은 때때로 도움이되지 않는다는 것입니다. Jacob은 Native Method Release ()를 호출하지만 메모리 (Java 메모리조차도 없지만 JVM 프로세스 메모리)가 통제 할 수 없을 정도로 증가합니다.

다른 팁

몇 가지 추가 제안 :

  1. 전화를 옮깁니다 ComThread.Release() a finally 블록, 그렇지 않으면 예외가 발생하면 스레드가 첨부되어 있습니다.

  2. 당신이 전화하는지 확인하십시오 ComThread.InitMTA 그리고 ComThread.Release com 객체를 사용하는 모든 스레드에서. 작업자 스레드 에서이 작업을 수행하는 것을 잊어 버린 경우 해당 스레드가 자동으로 첨부되어 분리되지 않습니다.

  3. 피하다 InitSTA 그리고 고집합니다 InitMTA. COM을 사용하여 스레드가 하나만 있더라도 찾았습니다. InitSTA 벗겨지기 위해. Jacob의 내부 마샬링 메커니즘이 어떻게 작동하는지 모르겠지만 유효한 것으로 보이지만 메소드가 호출 될 때 아무것도하지 않는 "고스트"객체로 끝났습니다.

다행히도 나는 아직 Jacob 라이브러리에서 코드를 수정할 필요가 없었습니다.

나는이 문제를 직접 만났다. Initmta 등을 엉망으로 만든 후. 간단한 수정 사항을 찾았습니다 - Java를 시작하면 다음을 명령 줄에 추가합니다 : -dcom.jacob.autogc = true

이로 인해 Rot 클래스는 해시 맵 대신 약한 해쉬 맵을 사용하여 문제를 해결합니다.

또한 -dcom.jacob.debug = true를 사용하여 많은 유익한 디버그 스펙을보고 썩은 맵의 크기를 볼 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top