Akashic Records

VM 분석 : Chapter 2 VM의 구조와 튜닝 - 2 본문

오래된글/Articles

VM 분석 : Chapter 2 VM의 구조와 튜닝 - 2

Andrew's Akashic Records 2018. 4. 19. 14:45
728x90

PLT 2.3 GC 로그 수집과 분석

HP Unix 경우에는-Xverbosegc 옵션이 있지만 여기서는 자바 표준 옵션인 –verbosegc 을 이용한 로그 수집과 분석에 관하여 알아보겠다. 다음은 –verbosegc 옵션을 주었을 때 생성되는 Minor GC, Full GC 로그이다. 하지만 GC로그는 다른 어플리케이션의 Stdout내용과 같이 출력되기 때문에 분석을 위해서 정제를 해야 한다.

[GC 2936K->2764K(4112K), 0.0066740 secs]

[GC 3270K->2904K(4112K), 0.0034900 secs]

[GC 3416K->2964K(4112K), 0.0030190 secs]

[GC 3476K->3345K(4112K), 0.0042970 secs]

[GC 3856K->3553K(4112K), 0.0047260 secs]

[GC 4065K->3818K(4368K), 0.0053370 secs]

[Full GC 3818K->2769K(4368K), 0.0752500 secs]

[GC 3281K->2811K(5196K), 0.0039310 secs]


- [GC : Minor GC를 나타낸다.

- [Full GC : Full GC를 나타낸다.

- 2936K->2764K(4112K), 0.0066740 secs : “2936k”는 GC전의 Heap 사이즈를 말하고, “2764k”는 GC 이후의 Heap사이즈를 말하며, “(4112k)”는 총 Heap 사이즈를 “0.0066740”은 GC 수행 시간을 말한다.

! GC 이후의 사이즈는 총 Heap 사이즈에서 Eden+Suvivor 1개의 영역이 Clear 된 상태이기 때문에 Old영역과 비슷한 크기를 나타낸다.

! 총 Heap 사이즈는 JVM의 현재 사용 Heap 메모리량이다. –Xms, -Xmx 옵션으로 조정할 수 있다.


로그파일 분석

1. 로그파일 정제

GC.

awk Script

BEGIN {
 printf("Minor\tMajor\tAlive\tFreed\n")
}
{
 if ( substr(body,1,4) == "[GC " )  {
   # break each input line into 4 pieces in array[]
   split(body,array," ");
   # array[1]="[GC"
   # array[2]="20713K->549K(64768K),"
   # array[3]="0.0086130"
   # array[4]="secs]"
   printf("%s\t0.0\t",array[3])
   # break array[2]="43960K->1749K(64768K)," into 4 pieces in barray[]
   split(array[2],barray,"K")
   # barray[1]="43960"
   # barray[2]="->1749"
   # barray[3]="(64768"
   # barray[4]="),"
   before=barray[1]
   after=substr(barray[2],3)
   reclaim=before-after
   printf("%s\t%s\n",after,reclaim)
 }
 if ( substr(body,1,9) == "[Full GC " )  {
   # break each input line into 4 pieces in array[]
   split(body,array," ");
   # array[1]="[Full"
   # array[2]="GC"
   # array[3]="20713K->549K(64768K),"
   # array[4]="0.0086130"
   # array[5]="secs]"
   printf("0.0\t%s\t",array[4])
   # break array[2]="43960K->1749K(64768K)," into 4 pieces in barray[]
   split(array[3],barray,"K")
   # barray[1]="43960"
   # barray[2]="->1749"
   # barray[3]="(64768"
   # barray[4]="),"
   before=barray[1]
   after=substr(barray[2],3)
   reclaim=before-after
   printf("%s\t%s\n",after,reclaim)
 }
 # no idea what this line is so skip it
 next;
}


2. 분석스크립트 실행

“awk -f GC.awk jeus42/logs/JeusServer/JeusServer_12012004_0.log > GC.log”

Minor       Major Alive       Freed
0.0484179   0.0 20909       19640
0.0411095   0.0 21405       19792
0.0846190   0.0 22995       18698
0.0492838   0.0 23672       19611
0.0         0.1452965 1749        42211
0.0310949   0.0 2810        19227
0.0469624   0.0 3657        19441
0.0580108   0.0 4847        19098


3. 생성된 로그파일을 엑셀로 불러와서 그래프를 그린다.

Sample graph of minor/major collections

Sample graph of GC behavior


728x90
Comments