2016-08-28 7 views
2

GUI로 실행해야하는 제 3 자 소스 코드를 사용하고 있습니다. 그러나 GUI를 사용하지 않고이를 통합하고 있습니다. 사용중인 타사 코드에서 심각한 메모리 누수가 발생했습니다. . 그래서 어떻게 든 sandbox와 같은 제 3 자 애플리케이션 인스턴스의 객체를 생성 할 수 있을지 궁금합니다. 샌드 박스와 같이 객체를 나중에 제거 할 수 있으며 해당 객체가 호출 한 객체에 대한 모든 참조가 제거됩니다. 가비지 컬렉터.Java를 사용하여 "샌드 박스"모드에서 라이브러리를 실행하는 방법은 무엇입니까?

가능한가요? 비슷한 시나리오를 달성하기 위해 어떤 대안이 있습니까? 또는 java -jar customApp ...와 같은 프로세스 작성기에서 다른 응용 프로그램을 호출 할 수있는 유일한 가능성을 원하십니까? 그건 좀 못생긴하지만 ...

편집 : 해당 코드를 별도의 스레드에서 실행 한 다음 쓰레드가 완료 될 때까지 기다려야 가비지 수집기가 호출 된 것과 관련된 모든 객체를 제거하게됩니까?

+0

네이티브 코드를 자신의 개체에 넣을 수는 있지만 메모리가 누출되지는 않습니다. GC는 네이티브 코드에 의해 할당 된 메모리를 처리 할 방법이 없습니다. – duffymo

+0

나는 이것이 현재 믿을만하다고 생각하지 않는다. 클래스 객체도 언로드 할 수 있어야합니다. JVM이 모든 상황에서 그렇게 할 수 있다고는 생각하지 않습니다. 메모리 누수가없는 라이브러리를 찾는 것이 가장 좋습니다. (그리고 만약 당신이 자바 라이브러리 대신 네이티브 라이브러리를 원한다면, 네 모든 베팅은 확실히 꺼져 있습니다.) – markspace

답변

1

먼저 메모리 프로파일 러 (예 : yourkit)를 사용하여 메모리 사용 상황을 실제로 조사하고 메모리 소비 원인을 완전히 이해하기 전까지는 길들이기에 성공하지 않을 것입니다.

둘째, Java가 아닌 네이티브 메모리가 문제라면 아무 것도 할 수 없습니다.

다음은 대략적인 내용 일 수 있습니다.

문제가되는 라이브러리를 자체 클래스 로더에로드하고 메인 클래스 로더에서로드 한 다음 매우 특수한 클래스 로더를 상속하는 매우 좁은 인터페이스를 통해서만 참조하십시오. 이것은 라이브러리에서 생성 된 객체에 대한 참조가 유지되는 것을 훨씬 어렵게하지만 불가능하지는 않습니다. 예를 들어, 라이브러리가 스레드를 생성하고 참조를 ThreadLocal 오브젝트에 넣는 경우, 스레드를 죽이라는 지시가없는 한, 시작한 곳으로 돌아갈 수 있습니다. 라이브러리가 정적 참조에 많은 수의 객체를 쌓아두면 여전히 도움이되지 않습니다.