2008-09-22 3 views
16

자바 스윙 응용 프로그램에서 메모리 누출을 찾기 위해 jProfiler를 사용하고 있습니다. 카운트가 계속 증가하는 JFrame의 인스턴스를 확인했습니다.'JNI 글로벌 참조'란 무엇입니까

이 프레임을 연 다음 닫습니다.

jProfiler를 사용하고 Path to GC Root를 보면 'JNI Global reference'라는 하나의 참조 만 있습니다.

이것은 무엇을 의미합니까? 왜 프레임의 각 인스턴스에 매달리고 있습니까?

답변

8

위키 백과는 기본적으로 Java Native Interface에 대한 개요가있어서 다른 언어로 작성된 Java와 기본 운영 체제 라이브러리 간의 통신이 가능합니다.

JNI 글로벌 참조는 자동으로 가비지 수집되지 않으므로 메모리 누수가 발생하기 쉽고 프로그래머는이를 명시 적으로 해제해야합니다. JNI 코드를 직접 작성하지 않으면 사용중인 라이브러리에 메모리 누수가있을 가능성이 있습니다.

편집here 좀 더 대 지역 글로벌 참조에 대한 정보 및

+2

위키 백과는 보조 자료입니다. 주요 출처 및 공식 문서는 [JNI 사양] (http://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/jniTOC.html)입니다. – EJP

12

JNI 글로벌 참조는 "기본"코드에서 참조가 글로벌 참조가 사용된다 (그리고 그들이 해방되는 방법) 이유 Java 가비지 컬렉터에 의해 관리되는 Java 오브젝트에 전송합니다. 이것의 목적은 네이티브 코드에 의해 여전히 사용되고 있지만 Java 코드에서 라이브 참조가없는 것으로 보이는 객체의 수집을 방지하는 것입니다.

JFrame은 java.awt.Window이며 "기본"Window 개체와 연결됩니다. 특정 JFrame 인스턴스를 완전히 마쳤 으면 dispose() 메서드를 호출하여 정리해야합니다.

네이티브 코드가 JFrame에 대한 전역 참조를 만들고 있는지 확실하지 않지만 가능성이 있습니다. 이 경우 JFrame이 가비지 수집되지 않습니다. 많은 Windows (또는 서브 클래스)를 작성하고 절대로 수집되지 않는다는 것을 알게되면 이들이 폐기되었는지 확인하십시오.

+0

코드가 Java 인 경우 가장 가능성이있는 설명입니다. 전역 포인터에 문제가 있었지만 JNI와 함께 작업 해 왔습니다. –

7

JavaFX 응용 프로그램에서 메모리 누수를 수정할 때이 정확한 문제가있었습니다. 결국 문제는 내가 디버그 모드에서 응용 프로그램을 실행하고 코드에 여러 개의 중단 점이 있음이 밝혀졌습니다. 이것은 객체를 'JNI Global reference'로 만들고 명백한 이유없이 메모리에 보관하게 만든 것 같습니다. 디버그 모드를 끄면 모든 것이 제대로 작동했습니다!

+0

젠장,이게 정확히 내게 일어난 일이야! – Trejkaz

+0

하나 더 여기 .. ​​하하 – BrunoJCM