URLClassLoader를 확장하는 사용자 정의 클래스 로더를 사용하고 있습니다. 내 사용자 정의 클래스 로더에 일부 클래스를로드하고 일부 작업을 수행합니다. 일단 작업이 완료되면 나는 클래스 로더를 처분하고 싶다. null에 대한 참조를 설정하여이를 시도했다.클래스 로더 처분
하지만 클래스 로더를 가비지 수집하지 않습니다.
내가 달성하고자하는 것을 도울 수있는 방법이 있습니까?
URLClassLoader를 확장하는 사용자 정의 클래스 로더를 사용하고 있습니다. 내 사용자 정의 클래스 로더에 일부 클래스를로드하고 일부 작업을 수행합니다. 일단 작업이 완료되면 나는 클래스 로더를 처분하고 싶다. null에 대한 참조를 설정하여이를 시도했다.클래스 로더 처분
하지만 클래스 로더를 가비지 수집하지 않습니다.
내가 달성하고자하는 것을 도울 수있는 방법이 있습니까?
ClassLoader doc : Every Class object contains a reference to the ClassLoader that defined it
. 이로 인해 로더가 수집되지 않습니다. 해당 클래스의 클래스 및 인스턴스에 대한 모든 참조도 null로 설정해야합니다.
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4950148에 6 년 된 버그가 있습니다. 원하는 버그 인 것 같습니다. 불행히도 이러한 기능은 아직 구현되지 않은 것 같습니다 ...
기본적으로 @variant는 이미 지적했듯이 특정 클래스 로더에 의해로드 된 모든 클래스를 역 참조하면 해당 클래스 로더가 가비지 수집 가능해야합니다. 그러나 적어도 하나의 예외가 있습니다. 즉, 클래스가 serialize 된 경우 해당 클래스 (클래스 로더)는 ObjectStreamClass
으로 내부적으로 참조 된 상태로 유지되며 원시 클래스이므로 가비지 수집되지 않습니다. 따라서이 경우 전체 JVM이 종료 될 때까지 클래스 로더를 가비지 수집 할 수 없습니다.
here, "가비지 수집 및 직렬화와 관련된 문제"절을 참조하십시오.
이 클래스 로더에 의해로드 된 클래스 중 하나라도 참조되는 한 클래스 로더는 가비지 수집되지 않습니다. 따라서 클래스 로더에 대한 모든 직접적인 참조가 무효화 된 경우,이 클래스 로더에 의해로드 된 클래스에 대한 모든 참조 및 이러한 클래스의 인스턴스에 대해 클래스 로더가 제거됩니다. 그런 다음 가비지 컬렉터의 다음 실행에 덤프 될 수 있습니다.
ClassLoader에 의해 생성 된 클래스의 인스턴스가 없어지면 ClassLoader가 가비지 수집됩니다. 명시 적으로 파일 잠금과 같은 문제를 일으키는 ClassLoader를 명시 적으로 처리 할 수 없다는 것과 관련된 오래된 버그 (4950148)가 있습니다.
이제 fixed in JDK 7에 URLClassLoader.close() 메서드가 추가되었습니다.
http://stackoverflow.com/questions/148681/unloading-classes-in-java/148707#148707 –
동일한 질문이 아닙니다.이 질문은로드 된 클래스가 아닌 클래스 로더를 언로드하는 것과 관련되어 있습니다. –
나의 첫 번째 충고는 클래스 로더 내부의 클래스를 쓰레기로 만들지 않는 점을 확인하는 것입니다. 덤프를 만들고 클래스 로더가 보유한 클래스에 대한 종속성을 분석하십시오. –