DevBoi

[Spring] GC log 완전히 분석하고, 튜닝하기! 본문

Develop/[Spring]

[Spring] GC log 완전히 분석하고, 튜닝하기!

HiSmith 2023. 1. 30. 19:36
반응형

오늘은 GC log를 보는 법, 그리고 분석 및 모니터링하는 방법에 대해서 공부를 해볼까 한다.

기존 구조는 스프링이고, 해당 스프링 프로젝트에서 GC가 어떻게 동작되는지, 로그를 어떻게 남기는지에 대한 모니터링 및 분석을 진행해볼까한다.

 

1) 스프링 샘플 프로젝트를 생성한다.

걍 뭐 간단한, 일을 하는 이런 컨트롤러가 달린 녀석을 샘플 프로젝트로 만들어 보자

@RestController
public class MyController {

	@GetMapping(value = "/test")
	public String test1() {
		MyDto d1 = new MyDto();
		MyDto d2 = new MyDto();
		return "test1";
	}
	
}

 

 

2) GC log 설정

-vmargs
-Dosgi.requiredJavaVersion=11
-Dosgi.dataAreaRequiresExplicitInit=true
-verbose:gc
-Xloggc:/Users/ysj/Desktop/workspace/gclog/umonEclipse_gcLog.prof
-XX:+PrintGCDetails
-XX:+PrintTenuringDistribution
-XX:+UseParallelOldGC
-XX:PermSize=128m
-XX:MaxPermSize=128m
-XX:NewRatio=12
-Xms256m
-Xmx2048m

 

 

3) GC logging 툴

 

일부 필요없는 내용을 걷어내고, 중요한 부분만 음영 처리하였다.

물론 파일을 날짜별로 할 수도있지만, 우선 로그를 보고 해당 내용을 정리하는 것이 목적이다.

해당 GC파일이 경로에 생성되었는지 확인해보자

https://gceasy.io/

 

gceasy.io

How to enable Java GC Logging? For Java 1.4, 5, 6, 7, 8 pass this JVM argument to your application: -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc: For Java 9, pass the JVM argument: -Xlog:gc*:file= file-path: is the location where GC log file will be

gceasy.io

여기에 들어가게 되면, 온라인에서 별도 툴 설치 없이 GC로그를 볼 수 있다.

무튼, 나는 맥이니까 tail -f 로 해당 로깅 파일 내용을 본다.

여러가지의 리전 정보들이 뜬다.

이제 실제 애플리케이션을 동작시키면서 GC log를 보도록하자

 

실제 서버를 구동만했을때의 GC로그이다.

G1 gc라서 그런가. gc가 자주 돌고, 해당 돌면서, 변화되는 값들을 보자

자바 메모리 구조에 대해서는, 다시 한번 보면서 파악해보자

 

Eden regions 은 특정 값에서 -> 0으로 간다.

minor GC가 발생하는 부분이다. 이부분이 꽉차면, minor gc가 발생하고, eden영역이 비워지고, survivor영역으로 이동하게 된다.

이를 promotion이라고 칭하는데, 무튼 이부분이 진행이 되는것을 볼 수 있다.

 

같이 유의깊게 봐야하는 부분이

[26.964s][info][gc,heap     ] GC(77) Survivor regions: 5->4(5)
[26.964s][info][gc,heap     ] GC(77) Old regions: 157->162

 

[499.280s][info][gc,heap     ] GC(78) Survivor regions: 4->3(5)
[499.280s][info][gc,heap     ] GC(78) Old regions: 162->166

 

이부분이다.

즉, 서바이버 리전에서 사용하는 영여깅 감소되면서, Old region이 사용공간은 증가하게 된다.

그러면 이 Old region의 용량은 안주나?

좀더 살펴보도록하자

 

[499.731s][info][gc,heap     ] GC(80) Eden regions: 28->0(28)
[499.731s][info][gc,heap     ] GC(80) Survivor regions: 5->5(5)
[499.731s][info][gc,heap     ] GC(80) Old regions: 166->170
[499.731s][info][gc,heap     ] GC(80) Archive regions: 0->0
[499.731s][info][gc,heap     ] GC(80) Humongous regions: 8->8

 

[499.882s][info][gc,heap     ] GC(84) Eden regions: 30->0(38)
[499.882s][info][gc,heap     ] GC(84) Survivor regions: 3->5(5)
[499.882s][info][gc,heap     ] GC(84) Old regions: 180->180
[499.882s][info][gc,heap     ] GC(84) Archive regions: 0->0
[499.882s][info][gc,heap     ] GC(84) Humongous regions: 11->11

 

휴몽고스 리전이 Old region이 증가하면서 같이 비례한다.

다만 Old region이 증가할때 무조건 같이 증가하지 않고, 특정 늘어나게 되면 즉 Old region이 5번 증가되면 해당 영역이 같이 증가되는 것을 볼 수있다.

 

Humongous region은 뭘까?

G1Gc의 구조에 대해서 가져왔다.

거대한 객체, 즉 공간을 많이 차지하는 객체에 대해서 해당 영역을 할당한다고 한다.

즉, 처음에 서버가 기동할때, 초기 구성에 대한 빈들 중 크기가 큰것은 미리 이 공간에 넣어놓는것이다.

 

자.. 그러면 일단 일반 적인 구조와 동작방식은 알았고, 내 로직이 돌아가면서 gclog를 보자

 

사알짝이지만, 30분 이후에 높아진 수치가 있다.

이때 controller에서 콜을 했을때 높아지고 gc이후에 해당 수치가 다시 낮아졌다.

이때 minor gc 와 majorgc가 수행이 되고 다시 heap size가 여유있게 늘어난게 보인다.

 

 

 

반응형