안녕하세요. 요새 이것 저것 보다가 문득 클래스 로더는 언제 class를 로드하는지에 대해 궁금했습니다. 이것을 직접 trace 해 볼 수 있는 방법은 없는지를 찾다가 -XX:+TraceClassLoading에 대해서 알게 되었어요. 그리고 조금 더 찾다 보니, 이런 문서도 발견하게 되었는데요. 업데이트가 된 버전에서는 이 옵션 대신 다른 옵션을 쓰라고 안내해 주고 있었어요.

 


 현재 제 서버에 있는 java와 javac 버전입니다. Openjdk를 쓰고 있어요. Main.java를 컴파일 한 다음에 java 명령어로 실행을 시켜보겠습니다. 제가 위에서 링크한 문서에 따르면, Unified logging이 자바 9부터 도입되면서 몇 개의 tracing flag가 다른 것으로 대체되는데, TraceClassLoading, TraceClassUnloading도 이에 속합니다.

 

 

 어찌 되었던 옵션으로 -Xlog:class+load=info를 붙여주면, 클래스가 로드 될 때 마다 로그를 남기게 됩니다. 반대로 클래스가 unload 될 때 마다 로그를 남기려면, -Xlog:class+unload=info를 붙여주면 됩니다.

 

 다시 1.8 버전으로 돌려놓았습니다.

 

  Main.java를 다시 컴파일 하고 java 명령어로 실행을 해 보았습니다. -XX:+TraceClassLoading 옵션으로 실행을 해 보니, 클래스가 로드 될 때마다 log를 남기는 것을 볼 수 있어요.

 

 

 그런데 사실, -verbose:class 옵션을 입력해도 됩니다. 문서에 따르면, 클래스가 load 되거나 unload 될 때 logging을 한다 되어 있거든요. 파일에 로깅하는 것은 redirect를 적당히 잘 응용하면 어렵지 않게 할 수 있을 겁니다.

 


 실험을 해 볼 프로그램입니다.

 

 10초 동안 sleep을 한 다음에, Singleton의 getInstance를 호출합니다. 눈치 채셨을 지도 모르겠지만 SIngleton은 싱글톤으로 생성되는 무언가입니다.

 

 

 안에 내부 클래스를 보겠습니다. 보시면 다른 건 없고, 이상한 내부 Holder 클래스와 내부에서 새로운 Singleton 객체를 생성하는 것이 보이는데요.

 

 

 10초를 sleep 하기 전에 여기까지 실행이 된 상태였습니다.

 

 

 10초가 지난 후에, Singleton을 Load 하고 Singleton$Holder를 load 하면서 Singleton made가 출력되게 됩니다. 즉, 싱글톤 객체가 만들어지는 시점은 Singleton$Holder가 로드되고 난 후라는 이야기입니다.