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 |
---|