2016-10-17 3 views
2

Google의 메소드를 사용하여 클래스 로더 누수를 해결하는 방법을 볼 수 있지만 클래스 로더 누출은 무엇인지 설명되어 있지 않습니다.클래스 로더 누출이란 무엇입니까?

내가 부하 객체 Person person = new Person()을로드하면 Person 클래스는 클래스 loader.Person 클래스 객체에 의해로드됩니다. 영구적 인 상태에서도 메타 공간에 머무를 것입니다 (java 8 이전에는 영구적으로 유지됩니다). Person 객체 (Person 클래스가 아닙니다. 객체)는 응용 프로그램에서 사용되지 않습니다. 메모리 누수로 간주됩니까?

답변

0

클래스 로더를 만들지 않으면 클래스 로더가 누출 될 수 없습니다.

시간이 지남에 따라 여러 클래스 로더를 만들고 이전 클래스 로더의 모든 클래스가 가비지 수집되도록하려면 클래스 로더 누수가 발생합니다. 이러한 종류의 가장 일반적인 시나리오는 컨테이너에서 웹 응용 프로그램을 다시로드하는 것입니다.

클래스 로더의 가비지 수집은 까다로운 작업입니다. 예를 들어 ThreadLocals를 사용할 때와 같이 코드에서 참조를 보유하지 않아도 인스턴스가 여전히 참조됩니다.

+0

내 게시물의 시나리오가 클래스 로더 유출 사례가 아님을 의미합니까? –

+0

아니요, 클래스 로더 유출이 아닙니다. –

+0

당신이 '이 종류의 가장 일반적인 시나리오는 컨테이너에서 웹 응용 프로그램을 다시로드하는 중입니다.'라고 생각합니다. 다시 시작한 후에도 다시로드하고 다시 시작한다는 것은 동일한 의미입니까?) 웹 서버의 바람둥이, 때로는 웹 서버가 미리로드 된 클래스 로더를 해제 할 수 없습니다. 그렇지? 또한 당신은'다중 클래스 로더를 생성하고 있습니다. '라는 뜻은 무엇입니까? 나는 클래스 로더를 명시 적으로 생성하는 개발자를 보지 못했습니다 (항상 jvm 또는 웹 서버에 의해 수행됩니다). 그래서 실질적으로 클래스 로더 누수가 가능할 때. 여기서 더 자세히 설명해 주시겠습니까? –

1

응용 프로그램 서버 내에서 응용 프로그램을 다시로드하거나 다시 배포 할 때 클래스 로더 누수가 발생할 수 있지만 전체 서버를 다시 시작할 때 발생하지는 않습니다. 응용 프로그램 서버에서 응용 프로그램을 다시 시작할 때마다 Tomcat을 사용하면 응용 프로그램의 클래스를로드하기 위해 새 클래스 로더가 만들어집니다. 동시에 이전 클래스 로더는 더 이상 사용되지 않습니다. 이전 클래스 로더에 대한 모든 참조가 제거되었으므로 이제 가비지 수집을 위해 사용할 수 있어야합니다. 이전 클래스 로더에 대한 참조가 모두 제거되지 않은 경우 가비지 수집이 불가능하며 클래스 로더 유출이 발생합니다.

클래스 로더 누출의 가장 흔한 원인은 하나의 응용 프로그램 서버 내에서 여러 응용 프로그램간에 공유 라이브러리를 사용한다는 것입니다. 예를 들어 이러한 라이브러리는 웹 응용 프로그램 클래스 로더에 대한 정적 참조를 보유하고 있으며 응용 프로그램이 중지 된 후에도이 클래스 로더를 가비지 수집 할 수 없습니다.