2013-05-02 1 views
0

일부 메모리 누수를 제거하려고합니다. 클래스 로더에서 모든 클래스의 모든 정적 변수 (광산뿐만 아니라)를 재설정하고 싶습니다. ClassLoader가 알고있는 모든 클래스를 나열하는 classes 속성이 있습니다.정적 블록 초기화가 실행되었는지 확인하는 방법은 무엇입니까?

그래서 루프를 반복하고 정적 변수를 null로 설정합니다.

문제는 모든 클래스가 반드시 초기화되지 않은 것입니다 (정적 블록 초기화가 실행되지 않음). 값을 재설정하고 클래스를 언로드하는 것이 목적이므로이 클래스를 초기화 할 시점은 없습니다. 또한, 다른 클래스의 SBI에서 사용되는 클래스 ROOT를 재설정하면 CHILD의 SBI를 실행하면 예기치 않은 동작이 발생할 수 있습니다 ...

그래서 질문입니다. SBI JVM에 의해 실행되었는지 여부.


참고 : 클래스 로더의 findLoadedClass를 사용하는 제안 누구에게도

,이 중요한 문장 사양에 있습니다 : 이 게시물에 중요한 참고가 * "로드는"아무튼 ' t는 "초기화 됨"을 의미합니다. 초기화는 JLS3에 의해 정의 된 정확한 순간에만 발생합니다. $ 12.4.1 *

+1

내가 그 무엇을 생각 http://stackoverflow.com/questions/3678579/how-to-check-whether-a-class-is-initialized ClassLoader 당신이 감지 할 수있는 JVM에로드 된 클래스가 개봉 – LionC

+0

검색 정적 블록이 메모리 링크의 원인이라는 것을 어떻게 알 수 있습니까? 당신은 광범위하게 윤곽을 잡았습니까? 원인을 확실히 알지 못하는 한 조기에 최적화하려고 시도하는 것은 바람직하지 않습니다. –

+0

@LionC 내 게시물 편집을 참조하십시오. – poussma

답변

0

static 클래스가 JVM에로드 된 경우 블록이 초기화되었습니다.

+1

입니다. 이 게시물에는 중요한 참고 사항이 있습니다. *** "로드 됨"은 "초기화 됨"을 의미하지 않습니다. 초기화는 JLS3 $ 12.4.1에 정의 된 정확한 순간에만 발생합니다. *** – poussma