티스토리 뷰

프로그램/JAVA

자바 메모리 튜닝

길나미 2016. 10. 12. 10:58

목표

  • 서비스되는 시스템 사양에 맞게 적절한 메모리 값을 설정하여 성능을 최적화 하고 자원낭비를 줄임
  • Heap 메모리 사이즈 설정
    - 기준 1. minorGC의 발생빈도는 10초 내외로 하고, 발생소요시간은 50ms 미만으로 한다. 
    - 기준 2. majorGC의 발생빈도는 자주발생하지 않는다를 기준으로 하고, 발생했을경우 소요시간을 1초 미만으로 한다. 
    - 기준 3. og의 가용률의 증가치를 체크하여, ng의 적절한 메모리용량을 적용한다.


2016-04-28 jvm 현황


 


그래프 해석

1. 53과 14는 ratio 1:2, 1:9 정도의 비율로 53서버는 ngc의 영역이 14번에 비해 상대적으로 크므로 ygc 발생 빈도가 적다. 그러므로 ogc에는 ngc로부터 온 객체가 적다

2. ogc의 크기는 53, 14번서버 모두 5기가 이상으로 fgc가 자주 발생하지 않아 메모리 점유율이 완만하게 늘어난다(이건 사실 가정이고, heap 사이즈를 줄여 fcc가 적절히 일어나게끔 하고 메모리 증가율을 지켜보자)

3. global은 메모리옵션이 디폴트 이고, ngc와 oc의 메모리비율이 pool설정에 비해 1/5 수준이다.

4. global은 메모리 공간이 작으므로, ygc와 fgc의 발생 빈도가 높아 메모리반환이 자주 일어난다.

 

결론

1. 14(Pool002) 서버의  -Xms1024m -Xmx5120m -XX:NewRatio=2 로 변경하여 (heap 사이즈를 줄이고 ngc와 ygc의 비율을 조정) fgc가 발생횟수가 증가하여 그래프가 증감이 될것을 기대하고 1주일간 다시 지켜보자

2. global의 튜닝없이 default로 설정되어 있어, ogc 사용률이 90% 이상까지 점유하는것은 바람직하지 않으므로, 최적의 튜닝값을 찾아야 한다. (각 서버마다 설정값을 달리하여 지켜보는 수밖에)

3. 프로젝트의 (ehcache 및 static 데이터의 사용이 많은) 구조상 메모리 max 사용이 어느정도인지 제한이 있어야 하고, 자원낭비를 줄어야 한다.

 

 

 

 

2016-05-03 jvm 현황


위에서 내린 결론을 기반으로, 14번 서버를 대상으로 jvm 설정을 변경하여 모니터링함



그래프 해석

1. (1) 구간은 메모리 설정을 기존  -Xms6144m -Xmx10240m -XX:NewSize=512m -XX:MaxNewSize=1024m 에서  -Xms1024m -Xmx5120m -XX:NewRatio=2 로 변경하여 재시작

=> 힙사이즈를 max10G에서 5G로 줄임. ng와 og의 비율을 1:2로 설정하고, 메모리 사용량에 따라 동적으로 사이즈가 변경됨.

2. (2) 이구간에서는 ng로 할당된 메모리가 약700MB로, ngc가 자주발생하고, og로 이동되는 객체가 늘어남에 따라 og사용률이 증가하게 된다.

3. (3) og사용률이 99%가 되었을때 FGC가 발생했고, ng의 메모리 용량이 늘어남(초기 349,184KB -> max값인 약 1,740,288KB) 을 확인함.

그 후엔 ngc가 발생할때마다 yg로 이동하는 객체수가 줄었음을 확인. (yg의 메모리는 약1G이고, 사용률은 27%)

즉, Pool 서버에서 생성되는 객체는 새로 생성되고 ng영역에서 대부분 소멸되는 객체임을 추측할 수 있다.


결론

1. pool 서버는 객체가 생성되고 minorGC가 발생할때 대부분 소멸되는 객체이므로 ng 메모리는 위 그래프에서 확인한 약1.5G가 적당하다.

2. minorGC가 발생할때 소요시간은 아래표에서 확인하듯이 약 0.03초가 소요되어 문제 없음을 확인 할 수 있다.

S0 S1 E O M CCS YGC YGCT FGC FGCT GCT

38.39 0.00 98.61 27.43 97.91 95.60 12688 220.015 4 1.502 221.518
38.39 0.00 99.17 27.43 97.91 95.60 12688 220.015 4 1.502 221.518
0.00 33.29 1.59 27.50 97.91 95.60 12689 220.041 4 1.502 221.543

 

3. og는 너무 크게 잡으면 언젠가는 fgc가 발생할때 소요시간이 오래걸리므로, 현재 사용률 모니터링결과에 맞춰 약 1G가 적당하다.

5. min과 max의 차이가 크면 메모리를 동적으로 할당하는데도 비용이므로, min~max값을 동일하게

4. ng(1.5G) + og(1G) + 기타(50M) = 약 3G

 

 

'프로그램 > JAVA' 카테고리의 다른 글

톰캣 common-dbcp  (0) 2016.10.18
Troubleshooting 스레드사용법  (0) 2016.10.12
자바 메모리 분석방법 및 분석도구  (0) 2016.10.12
Spring Controller required 속성  (0) 2016.07.21
자바 버전 관리 및 운영 alternatives  (0) 2016.07.05
댓글