해당 포스트 작성의 목적
GC로그를 보는 방법을 알아보자. GC로그를 보고 트러블 슈팅을 해결하는데 큰 도움이 된다.
GC 로그는 어떻게 출력할까?
GC로그를 출력하는 방법은 간단하다. IDE를 사용한다면 각 IDE설정에 맞게 실행옵션에서 gc로그를 출력하는 옵션을 주면 된다. 터미널에서 java실행한다면,-
verbose:gc명령어를 통해서 GC로그를 출력할 수 있다. (무한루프를 돌리거나, System.gc()메소드로 gc를 강제로 실행시켜서 확인해볼수있다.)
java -verbose:gc .\NestedSample.java
PS E:\gitPrjxt\goj> java -verbose:gc .\NestedSample.java
[0.013s][info][gc] Using G1
[0.033s][info][gc] Periodic GC disabled
[0.450s][info][gc] GC(0) Pause Young (Normal) (G1 Evacuation Pause) 23M->2M(250M) 2.957ms
[0.512s][info][gc] GC(1) Pause Young (Normal) (G1 Evacuation Pause) 149M->2M(250M) 2.084ms
[0.529s][info][gc] GC(2) Pause Young (Normal) (G1 Evacuation Pause) 149M->2M(250M) 2.278ms
10000
위처럼 GC로그가 터미널에 출력된다!! 참고로 OS에 따라 명령어가 다르고, 앞서 사용한-verbose:gc 외에 여러 옵션들이 있으니 아래 이미지를 참고하자.
추가적인 옵션을 넣어 GC로그를 출력해보았다! 로그가 훨씬 많아졌으며, 더 다양한 정보를 알수있었다.
PS E:\gitPrjxt\goj> java -verbose:gc -XX:+PrintGCDetails .\NestedSample.java
[0.003s][warning][gc] -XX:+PrintGCDetails is deprecated. Will use -Xlog:gc* instead.
[0.011s][info ][gc,heap] Heap region size: 1M
[0.015s][info ][gc ] Using G1
[0.015s][info ][gc,heap,coops] Heap address: 0x0000000706200000, size: 3998 MB, Compressed Oops mode: Zero based, Oop shift amount: 3
[0.039s][info ][gc ] Periodic GC disabled
[0.449s][info ][gc,start ] GC(0) Pause Young (Normal) (G1 Evacuation Pause)
... //너무많아 중간 내용은 삭제했다.
[0.542s][info ][gc,cpu ] GC(2) User=0.00s Sys=0.00s Real=0.01s
10000
GC로그 읽는법
GC로그를 직접 읽을 수도있지만, 앞서 봤다싶이 옵션유무에 따라 로그양이 엄청 많아질수있다.
일반적인 디버깅로그를 보듯이 GC로그를 분석하기란 좀 힘들지 않을까... 싶다... 검색을 해보니 GC로그 자체를 읽어 분석하기보다 여러 시각화해주는 툴들을 이용해서 분석하는것 같다.
gceasy.io등의 사이트를 이용하면 GC로그를 분석해 시각화 해주는 기능을 이용할 수있다!
포스트를 작성하며 알게된점
GC로그를 출력하는데 있어서 기본적인 java 명령어와 옵션이면 볼수 있다는 것을 알았다. 실제로 출력해보면서, 실제 프로젝트에 투입되었을때 써먹어볼수 있을것 같다고 생각이 든다!
무엇보다 GC로그는 거의 성능에 영향을 미치지 않는다는 점이 신기했다. JVM 내부에서 논블록킹쓰기 매커니즘을 사용한다는데, 어제 멘토링때 멘토님이 말씀하셨던 동기와 비동기, 더 나아가서 블록킹과 논블록킹 방식도 물어볼수있다. 는 말이 떠올랐다. 지금은 이정도로만 알아보고, 추후에 블록킹/논블록킹을 공부할때 GC로그도 해당 매커니즘을 쓴다는걸 기억하자!
References
'프로그래밍 > Java' 카테고리의 다른 글
Static 변수의 메모리 해제-Weak/Soft Reference (0) | 2021.05.17 |
---|---|
클래스안의 클래스-2 (0) | 2021.05.17 |
클래스 안의 클래스-1 (0) | 2021.05.13 |
JVM이란 무엇인가 (0) | 2021.05.13 |
String의 == 연산시 동작 (0) | 2021.05.13 |
Uploaded by Notion2Tistory v1.1.0