안녕하세요. 요새 이것 저것 보다가 문득 클래스 로더는 언제 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가 로드되고 난 후라는 이야기입니다.
'코딩 > Java' 카테고리의 다른 글
java 접근 제어자 protected default에 대해 알아봅시다. (1) | 2022.02.03 |
---|---|
왜 java의 reference는 strong이 아닌 다른 친구들도 있을까요? (0) | 2022.01.27 |
java threadlocal 클래스에 대해서 간단하게 알아봅시다. (0) | 2021.12.29 |
토이 프로젝트를 하면서 느꼈던 광범위한 예외의 위험성 (9) | 2021.10.08 |
java 람다 개념을 이해할 때 중요할 법한 function apply 메서드를 알아봅시다. (0) | 2021.08.25 |
최근댓글