앞선 케이스에서는 튜닝 포인트가 없다. 또한 GC 튜닝은 권장되지 않는 작업이다.

하지만 극단적인 케이스에서는, GC로 인한 서비스 순단을 최소화 할 수 있다.

 


- 튜닝이 필요한 케이스?

 

GC 시간 및 주기를 파악해보고, 정상여부 확인

더보기
  • Minor GC의 처리시간이빠르다 (50ms내외).
  • Minor GC 주기가빈번하지않다 (10초내외).
  • Full GC의처리시간이빠르다 (보통1초이내).
  • Full GC 주기가빈번하지않다 (10분에 1회 )

- 튜닝 대상

 

1. Old 영역으로 넘어가는 객체 최소화 

 

Full GC는 Minor GC에 비해 5~10배 이상 오래걸린다.

그래서 Old 영역에서의 GC보다는, New 영역안에서 이루어지는 GC만으로 메모리 관리하는 것이 가장 좋다.

 

2. Full GC 시간 단축

 

GC시에는 stop-the-world 로 인해 프로세스가 멈추므로 , GC 시간을 최소화 하는것이 좋다

특히 Full GC는 시간이 오래걸리기때문에, 연계 프로세스에서 타임아웃이 걸릴수도 있다.

Old 영역의 크기를 잘 조절하여 GC 시간을 관리하여야 한다.

 

 

Old 영역을 줄인다

=> Full GC 시간은 줄어드나, 횟수가 증가함. 남은 Old 영역보다 많은 객체가 들어올 경우 OOM 발생

 

Old 영역을 늘린다

=> Full GC 횟수는 줄어드나, 시간이 증가함

 

- 튜닝 작업

 

※ 각 시스템, 서버, 프로그램 마다 변수가 다양하기 때문에 정해진 값이나, 권고 값은 없다.

   설정값 변경후에, 모니터링을 하며 ( 최소 24시간 ) 맞는 값을 찾아가야한다.

 

1. GC 방식 결정

 

  • Serial GC - 적은 메모리와 CPU 코어수가 작을 때 유리
  • Parallel GC - 메모리와 코어수가 많을때 유리. Serial과 다르게 다중 스레드 처리
  • Concurrent Mark & Sweep GC(이하 CMS) - 응답속도가 매우 빠르나, 메모리와 코어를 가장 많이 잡아먹는다.
  • G1(Garbage First) GC - Young / Old 에 개념이 없고, 객체별로 객체 할당 및 GC가 이루어짐. JDK 7 버전부터 적용

자세한 내용은 ( d2.naver.com/helloworld/1329 ) 참조

 

2. 메모리 설정

 

먼저, 힙 메모리의 크기를 정해준다.

 

더보기

-Xms : 힙메모리 초기 할당값

-Xmx : 힙메모리 최대 값

 

다음으로 할당된 메모리중에서 , New/Old 영역의 비율을 결정해준다.

 

더보기

-XX:NewRatio : New / Old 영역 비율 지정

ex) Ratio = 4 / New : Old = 1:4

 

3. 설정값 적용 후, 모니터링하며 값들을 수정한다.

 

#참조

d2.naver.com/helloworld/37111

'서버운영 > 자바 GC ( Garbage Collection )' 카테고리의 다른 글

GC분석 - GUI를 통한 gc 추이분석  (0) 2021.04.05
GC 분석 - gc 케이스 분석  (0) 2021.04.05
GC 관리  (0) 2021.04.04
GC ( Garbage Collection )  (0) 2021.04.04

GC 분석 방법에는 여러가지가 있다.

 

1. gceasy

 

- 별도 프로그램 설치없이, ( gceasy.io/ ) 접속 후에 로그파일을 올리기만 하면된다.

 

 

2. IBM JAVA Garbage Collector ( PMAT )

 

- 다운로드 : www.ibm.com/support/pages/node/1109973

- 실행 : java -Xmx1g -jar ga458.jar

 

- File -> Open verbosegc 수행후 gc.log 파일을 넣어주면 아래와 같이 요약본이 나온다.

- 표로 GC를 Timestamp 별로 정리해서 볼수도 있다.

 

- 그래프로 시간대별 GC 수행시간 / 수행전후 메모리 사용량 등을 확인할 수 있다.

 

- GC 비율 및 수행시간 확인

 

Minor GC : 4922회 수행/ 평균 10ms

Full GC : 27회 수행 / 평균 310ms 수행

 

 

 

3. Java VisualVM

 

- Jdk1.6 부터 bin 밑에 존재하는 JVM 분석 툴

- visualvm.github.io/에서 따로 내려받을수도 있다.

 

 

4. HP Jmeter

 

- HP에서 제공하는 분석툴

- m.blog.naver.com/PostView.nhn?blogId=bumsukoh&logNo=110142702864&proxyReferer=https:%2F%2Fwww.google.com%2F

'서버운영 > 자바 GC ( Garbage Collection )' 카테고리의 다른 글

GC 튜닝  (0) 2021.04.06
GC 분석 - gc 케이스 분석  (0) 2021.04.05
GC 관리  (0) 2021.04.04
GC ( Garbage Collection )  (0) 2021.04.04

gc.log 분석하는 방법을 작성해보려한다.

 

JVM 기동옵션은 아래와 같다.

더보기

-XX:+DisableExplicitGC : system.gc() 메소드를 수행하지 않음.

※ 자바에서 RMI ( Remote Method Invocation ) 사용시, 60초마다 system.gc() 를 호출해 Full GC 발생 

 

-XX:-UseAdaptiveSizePolicy : New 영역의 크기가 동적으로 변하지 않음

-verbose:gc : GC 기록을 출력

-Xloggc:{gc_Path}.gclog : GC를 파일로 출력함

-XX:+PrintGCDetails : GC에 대한 상세정보 출력

-XX:+PrintGCTimeStamps : GC를 초단위로 기록함

-XX:+PrintHeapAtGC : GC시에 Heap 메모리 상태 기록

 

GC 로그파일은 아래와 같다.

 

- Minor GC

 

더보기

{Heap before GC invocations=1 (full 0):
 PSYoungGen      total 354304K, used 315392K [0x00000007a8000000, 0x00000007c0000000, 0x00000007c0000000)
  eden space 315392K, 100% used [0x00000007a8000000,0x00000007bb400000,0x00000007bb400000)
  from space 38912K, 0% used [0x00000007bda00000,0x00000007bda00000,0x00000007c0000000)
  to   space 38912K, 0% used [0x00000007bb400000,0x00000007bb400000,0x00000007bda00000)
 ParOldGen       total 2228224K, used 0K [0x0000000720000000, 0x00000007a8000000, 0x00000007a8000000)
  object space 2228224K, 0% used [0x0000000720000000,0x0000000720000000,0x00000007a8000000)
 Metaspace       used 11772K, capacity 12066K, committed 12160K, reserved 1060864K
  class space    used 1284K, capacity 1401K, committed 1408K, reserved 1048576K
4.788: [GC (Allocation Failure) [PSYoungGen: 315392K->19963K(354304K)] 315392K->19979K(2582528K), 0.0095085 secs] [Times: user=0.14 sys=0.02, real=0.01 secs] 


Heap after GC invocations=1 (full 0):
 PSYoungGen      total 354304K, used 19963K [0x00000007a8000000, 0x00000007c0000000, 0x00000007c0000000)
  eden space 315392K, 0% used [0x00000007a8000000,0x00000007a8000000,0x00000007bb400000)
  from space 38912K, 51% used [0x00000007bb400000,0x00000007bc77ede8,0x00000007bda00000)
  to   space 38912K, 0% used [0x00000007bda00000,0x00000007bda00000,0x00000007c0000000)
 ParOldGen       total 2228224K, used 16K [0x0000000720000000, 0x00000007a8000000, 0x00000007a8000000)
  object space 2228224K, 0% used [0x0000000720000000,0x0000000720004000,0x00000007a8000000)
 Metaspace       used 11772K, capacity 12066K, committed 12160K, reserved 1060864K
  class space    used 1284K, capacity 1401K, committed 1408K, reserved 1048576K
}

한줄씩 분석해보면,

 

{Heap before GC invocations=1 (full 0):

 

- invocations=1 : 프로세스가 구동되고, 발생한 GC의 횟수

- full 0 : 발생한 Full GC 횟수

 

 PSYoungGen      total 354304K, used 315392K [0x00000007a8000000, 0x00000007c0000000, 0x00000007c0000000)
 PSYoungGen      total 354304K, used 19963K [0x00000007a8000000, 0x00000007c0000000, 0x00000007c0000000)

 

- Young Generation이 354,304KB 중에 315,392KB 사용중 -> 19,963KB 사용

 

  eden space 315392K, 100% used [0x00000007a8000000,0x00000007bb400000,0x00000007bb400000)
  from space 38912K, 0% used [0x00000007bda00000,0x00000007bda00000,0x00000007c0000000)
  to   space 38912K, 0% used [0x00000007bb400000,0x00000007bb400000,0x00000007bda00000)
  
  eden space 315392K, 0% used [0x00000007a8000000,0x00000007a8000000,0x00000007bb400000)
  from space 38912K, 51% used [0x00000007bb400000,0x00000007bc77ede8,0x00000007bda00000)
  to   space 38912K, 0% used [0x00000007bda00000,0x00000007bda00000,0x00000007c0000000)

- Eden 영역 100% 사용으로 인한 GC 발생으로 보임.

- GC후에 Survivor From 영역으로 이동. Eden 0% 사용

 

 ParOldGen       total 2228224K, used 0K [0x0000000720000000, 0x00000007a8000000, 0x00000007a8000000)
  object space 2228224K, 0% used [0x0000000720000000,0x0000000720000000,0x00000007a8000000)
 Metaspace       used 11772K, capacity 12066K, committed 12160K, reserved 1060864K
  class space    used 1284K, capacity 1401K, committed 1408K, reserved 1048576K

- New 영역에 대한 Minor GC 였으므로, Old 영역은 변화가 없음

 

4.788: [GC (Allocation Failure) [PSYoungGen: 315392K->19963K(354304K)] 315392K->19979K(2582528K), 0.0095085 secs] [Times: user=0.14 sys=0.02, real=0.01 secs] 

GC 결과 요약

- GC ( Allocation Failure ) : GC 발생이유. 메모리 할당 실패로 인한 GC발생

- Young 영역 정리 ( 315,392KB -> 19,963KB , 354,304KB 정리 )

- 0.0095초 소요

 


- Full GC

 

더보기

{Heap before GC invocations=3 (full 1):
 PSYoungGen      total 354304K, used 38891K [0x00000007a8000000, 0x00000007c0000000, 0x00000007c0000000)
  eden space 315392K, 0% used [0x00000007a8000000,0x00000007a8000000,0x00000007bb400000)
  from space 38912K, 99% used [0x00000007bda00000,0x00000007bfffafa8,0x00000007c0000000)
  to   space 38912K, 0% used [0x00000007bb400000,0x00000007bb400000,0x00000007bda00000)
 ParOldGen       total 2228224K, used 107K [0x0000000720000000, 0x00000007a8000000, 0x00000007a8000000)
  object space 2228224K, 0% used [0x0000000720000000,0x000000072001af50,0x00000007a8000000)
 Metaspace       used 20783K, capacity 21068K, committed 21248K, reserved 1069056K
  class space    used 2337K, capacity 2460K, committed 2560K, reserved 1048576K
5.461: [Full GC (Metadata GC Threshold) [PSYoungGen: 38891K->0K(354304K)] [ParOldGen: 107K->38122K(2228224K)] 38999K->38122K(2582528K), [Metaspace: 20783K->20783K(1069056K)], 0.0532366 secs] [Times: user=0.57 sys=0.03, real=0.05 secs] 


Heap after GC invocations=3 (full 1):
 PSYoungGen      total 354304K, used 0K [0x00000007a8000000, 0x00000007c0000000, 0x00000007c0000000)
  eden space 315392K, 0% used [0x00000007a8000000,0x00000007a8000000,0x00000007bb400000)
  from space 38912K, 0% used [0x00000007bda00000,0x00000007bda00000,0x00000007c0000000)
  to   space 38912K, 0% used [0x00000007bb400000,0x00000007bb400000,0x00000007bda00000)
 ParOldGen       total 2228224K, used 38122K [0x0000000720000000, 0x00000007a8000000, 0x00000007a8000000)
  object space 2228224K, 1% used [0x0000000720000000,0x000000072253a938,0x00000007a8000000)
 Metaspace       used 20783K, capacity 21068K, committed 21248K, reserved 1069056K
  class space    used 2337K, capacity 2460K, committed 2560K, reserved 1048576K
}

- from 영역의 Full로 인한 Full GC

- Old 영역이 107KB -> 38,122KB 로 증가

- GC 소요시간은 0.053초 정도. Minor GC 의 5배 정도 시간이다. ( 0.3초까지 걸리기도 함 )

'서버운영 > 자바 GC ( Garbage Collection )' 카테고리의 다른 글

GC 튜닝  (0) 2021.04.06
GC분석 - GUI를 통한 gc 추이분석  (0) 2021.04.05
GC 관리  (0) 2021.04.04
GC ( Garbage Collection )  (0) 2021.04.04

GC로 인해, 시스템에 장애가 올수도 있으므로 모니터링 및 관리가 필요하다.

 

 

※ 오랫동안 Full GC 발생하는 경우

 

1. Full GC 시간동안 Stop the world로 인해, 서비스가 중지되고

2. 그동안 쌓여있던 Queue로 인한 서비스 부하

 

※ Old 영역이 작게 할당되있을 경우

 

Old 영역이 작다면, Full GC의 수행시간이 짧아질수 있다.

그러나 계속 사용되는 객체 양에비해, Old 영역이 작다면 OOM이 발생할 것이다.

 

 

 

관리 옵션

 

JVM 기동 시, 자원 관련한 옵션들을 간단하게 정리해보았다.

 

-Xms , -Xmx : Heap 메모리 초기 할당값, 최대값 ( OS에서 프로세스에 할당해주는 값 )

-XX:NewSize : New 영역의 초기 할당값

-XX:MaxNewSize : New 영역의 최대값

-XX:NewRatio : New / Old 영역의 비율

-XX:SurvivorRatio : New / Survivor 영역의 비율

-XX:+UseParallelGC : 다중 스레드로 GC를 수행한다

 

 

모니터링 옵션

 

- GC 수행결과를 출력한다.

 

-XX:PrintGCDetail : GC에 대한 상세 정보를 출력

-XX:PrintGCTimeStamps : GC 수행시간에 대한 정보 출력

-XX:PrintHeapAtGC : GC시에 힙메모리 정보 출력

 

- OOM ( Out of Memory )발생시 , 당시에 Heap 메모리 사용량을 파일로 떨어트린다.

※ Heap 메모리 사용량과 동일한 용량으로 파일이 생성되므로, F/S 여유공간을 꼭 확인할 것

 

-XX:-HeapDumpOnOutOfMemoryError : OOM 발생시 Heap dump 생성

-XX:HeapDumpPath                         : Heap dump 파일의 위치

 

 

 

# 참조

 

waspro.tistory.com/340 ( GC 옵션 )

www.holaxprogramming.com/2013/07/20/java-jvm-gc/ ( JVM 기동 옵션 )

'서버운영 > 자바 GC ( Garbage Collection )' 카테고리의 다른 글

GC 튜닝  (0) 2021.04.06
GC분석 - GUI를 통한 gc 추이분석  (0) 2021.04.05
GC 분석 - gc 케이스 분석  (0) 2021.04.05
GC ( Garbage Collection )  (0) 2021.04.04

GC , 가비지 컬렉션 이란?

 

자바 프로세스가 동적으로 할당했던 메모리 영역중에, 필요없는 영역을 해제하는 기능

=> GC가 없다면, 더이상 사용하지 않는 잉여객체들이 메모리를 모두 차지해

     OOM ( Out of Memory ) 가 발생하면서 프로세스가 종료될 것.

 

- 장점

 

1. 프로그래머 입장에서 완벽하게 메모리 관리를 하지 않아도 된다.

  => 바라보고 있는 포인터, 언제 어떤 메모리를 해제할지 신경쓰지 않아도 됌

2. 불필요한 자원을 해제하여, 메모리 초과 방지

 

- 단점

 

1. GC 과정속에서 비용이 발생한다.

2. GC의 타이밍을 결정할 수 없다.

  => GC시에 stop-the-world 현상이 발생하여, 서비스 순단이 있을수 있다.

※ stop-the-world : GC 실행시, 자원을 해제하기 위해 JVM이 어플리케이션 실행을 멈추는 것

 

프로세스

 

GC의 대상은 크게 Eden, Survivor From/To, Old 영역이고, 대상에 따라 Minor, Full GC 로 구분할 수 있다.

 

Minor GC

 

1. 새로 생성된 객체가 Eden 영역에 할당된다.

2. Eden 영역에서 GC가 일어나고, 계속 사용하는 객체들은 Survivor From 영역으로 이동한다.

3. 다음 GC가 일어날때, From 영역의 객체들은 Survivor To 영역으로 이동한다.

4. Survirvor From 영역은 Clear 해지고, 계속되는 GC속에 살아남은 객체들은 Old 영역으로 옮겨진다.

 

Full GC

 

1. Old 영역에서 수행되는 GC를 Full GC라 하며, Minor GC 보다 시간이 더 소요된다.

 

'서버운영 > 자바 GC ( Garbage Collection )' 카테고리의 다른 글

GC 튜닝  (0) 2021.04.06
GC분석 - GUI를 통한 gc 추이분석  (0) 2021.04.05
GC 분석 - gc 케이스 분석  (0) 2021.04.05
GC 관리  (0) 2021.04.04

+ Recent posts