본문 바로가기

Programming Theory/JVM

Garbage Collection

1. Garbage Collection 이란?

heap 내 객체 중에서 garbage 를 찾아냄 -> 찾아낸 garbage 를 처리해 heap 메모리 회수

 

2. Garbage 대상

유효한 참조가 없는(unreachable) 객체

객체는 참조 사슬을 이룸.

유효한 참조 여부는 최초의 유효한 참조 여부에 따라 결정되며, 이를 객체 참조의 root set이라고 함


[heap 에 대한 객체들에 대한 참조]

 항목

 root set 여부

 heap 내 다른 객체에 의한 참조

 X

 JVM stack 의 stack frame의 local variable array 의 local variable(method parameter, 지역변수) 에 의한 참조

 O

 Native Method Stack 의 객체에 의한 참조

 O 

 Method Area 에 의한 참조

 O 

그림으로 보면 아래와 같음.

3. Oracle HotSpot VM 에서의 heap space 구성

1) 대부분의 객체는 금방 접근 불가능 상태(unreachable)가 됨

=> 아래와 같이 heap space를 구분해서 금방 접근 불가능 상태가 되는 대부분의 객체는 minor gc를 통해서 바로바로 gc를 수행한다.

 

 Young

 Old 

객체 속성

 새롭게 생성된 객체 (allocate됨)

 Young 영역에서 접근불가능한(unreachable) 상태가 되지 않은 객체 (Young 영역에서 promote됨)

크기

 작음

 큼

GC

 minor GC

 major GC (Full GC)

2) 오래된 객체에서 젊은 객체로의 참조는 아주 적음

Old 영역의 객체가 Young 영역의 객체를 참조하는 경우,  Old 영역의 card table 에 reference 내용을 저장함. Young 영역의 minor GC를 수행할 때, Old 영역의 card table을 참조함.


cf. major GC 의 구성

- Heap Space 의 Old 영역에서 발생하는 GC

- Method Area (Permanent Generation - permgen) 에서 발생하는 GC

** permgen 은 old 영역과 상관X


4. Yound 영역의 구성

- Eden 영역 (1개)

- Survivor 영역 (2개)

1) 처음 생긴 객체는 Eden 영역에 위치

2) Eden 영역의 객체 중 gc에서 살아남은 객체는 Survivor 영역 중 한 곳으로 이동 

3) Survivor 영역이 다 차면, gc를 발생시키고, 살아남은 객체는 다른 Survivor 영역으로 이동함

** Survivor 영역 중 한곳은 반드시 비워져 있음


5. GC 발생 시 JVM 처리

stop-the-world (STW)가 발생함.

** stop-the-world란?

- GC 실행을 위해 JVM 이 애플리케이션 실행을 멈추는 것

 -GC 를 실행하는 thread 를 제외한 나머지 thread 는 작업을 멈춤

** GC 튜닝 - stop-the-world 시간을 줄이는 것


6. OutOfMemory Error

no more memory could be made available by the garbage collector

GC가 되는 속도보다 heap space 에 object/instances 가 생성되는 시간이 더 빠를 때


ex) 1000개의 file을 1개의 method 에서 처리함. 해당 method를 호출하기 전 1000개 file 객체로 만들고 list에 담아서, 처리하는 method에 parameter로 넘겨준다. 

(영향1)

위 process 에서 old 영역 중 큰 부분을 오랬동안 차지한다면, 다른 process가 사용할 수 있는 old 영역이 작으므로, JVM 에 의해 full GC 가 더 자주 발생할 수 있다. 그럴 경우 STW가 자주 발생해서, 전체적인 프로그램 수행 속도가 느려질 수 있다.  

(영향2)

1000개 file 객체는 해당 method 의 jvm stack 의 local variable array 에서 참조하고 있는 list 에 의해 참조되고 있으므로, method가 끝날 때까지 unreachable 상태가 되지 않는다. 이때 heap space를 많이 사용하는 다른 process 가 기동된다면, heap space 가 가득차서 OutOfMemory Error가 발생할 수 있다.


7. JVM 설정

항목 

 예시

 내용

 -Xms<size>

 -Xms256m

 초기 heap size 지정

 -Xmx<size>

 -Xmx256m 

 최대 heap size 지정

 -XX:+HeapDumpOnOutOfMemoryError

 

 OutOfMemoryError 발생 시 HeapDump 를 working directory 에 떨어뜨리기

 -XX:HeapDumpPath=/path

 

 working directory 가 아닌 /path 에 HeapDump  떨어뜨리기

HeapDump 내용은 mat (http://www.eclipse.org/mat/) 등 heap dump analyzer tool을 통해서 Leak Suspect 등 분석 가능


8. 모니터링

visualvm 을 통해서 heap memory 사용현황, gc 현황 분석(Tools - plugins - VisualGC 설치) 가능

visualvm 은 jmx port를 통해서 전송되는 정보를 분석함.

local application 은 별다른 설정없이, jmx port를 통해 모니터링 가능

remote application 은 보안 문제로 jmx port를 지정해야 함. http://bcho.tistory.com/789


(해결책)

list 에는 file의 절대경로(absolutepath)를 담고, 해당 파일을 처리할 때 file 객체를 생성한다.


참고 : http://d2.naver.com/helloworld/1329

http://d2.naver.com/helloworld/329631


'Programming Theory > JVM' 카테고리의 다른 글

JVM Runtime Data Area  (0) 2016.08.21