Java heap management
자바의 메모리 관리는 garbage collection의 효율성을 높이기 위해 존재한다.자바의 특징 중 하나는 JVM이 자동으로 메모리 관리를 하는 것이다.
정확히 말하자면 메모리 해제만을 자동으로 한다. 그리고 이 기능을 garbage collection이라고 한다.
그림 1에서 볼 수 있듯이, heap 메모리 영역은 Eden과 Tenured로 크게 2 영역으로 나눠진다.
Eden
Eden은 자유영역 정도로 볼 수 있다. Object의 생성/소멸이 자유롭게 또는 빈번하게 이뤄지는 영역이라는 뜻으로 볼 수 있다.
Tenured
Tenured는 종신 영역이라 번역할 수 있는데, object가 이곳에 들어가면 빠져 나올 수 없다고 이해하는 것이 쉽다. 실제로 이런 이름이 어울리는 이유는 생성/소멸의 빈도에 따라 object의 위치를 바꾸기 때문이다.
Fig 2. Heap에서의 object 이동
그림2를 보면 heap 에서의 object의 이동을 원리를 알 수 있다.
Minor GC(=Young GC)
- Eden 영역에 "new" 연산자에 의해 Object가 생성된다.
- 설정된 비율 이상의 객체가 Eden에 할당된다.
- Eden+From Space(S0)에서 Minor GC(소규모 객체 해제, Young GC라고도 한다.)가 일어난다.
- 객체 중 참조(reference)가 없는 객체는 메모리 해제시킨다.
- 객체 중 참조가 남은 메모리는 To Space(S1)으로 보낸다.
- 설정된 비율 이상의 객체가 Eden에 할당된다.
- Eden+From Space(S1)에서 Minor GC(소규모 객체 해제, Young GC라고도 한다.)가 일어난다.
- 객체 중 참조(reference)가 없는 객체는 메모리 해제시킨다.
- 객체 중 참조가 남은 메모리는 From Space(S0)으로 보낸다.
- 1~4가 반복된다.
- 다음의 2가지 경우일 때, 해당 객체는 Tenured로 보내진다.
- To(S1)/From(S0) Space의 메모리 공간이 부족할 경우
- 설정된 횟수(기본 32) 이상 GC되지 않고, S1과 S0로 반복적으로 옮겨다닌 객체일 경우
Major GC(=Old GC)
설정된 비율이상으로 Tenured 영역이 채워지면 Old GC를 통해 메모리를 해제시킨다.Full GC
Tenured 영역이 가득 찰 경우, JVM은 다른 모든 동작을 멈추고 Gabage Collection만 수행한다.이 때, 서버의 기능은 수초간 멈추게 된다. Full GC가 있었다는 것은 메모리 중 해제되지 않는 객체가 있다는 것이다. 즉, 메모리 누수(Memory Leak)을 의심해 볼 수 있다.
Permanent Area
Permanent Area는 Class를 Loading하는데 사용한다.개발 환경에서 편의상 사용하는 Hot Deploy는 Permanent Area 로 Class가 Loading하면서 기존의 Loading 되어있던 클래스를 Unloading하는 것이다. IDE의 디버깅 모드를 생각하면 되겠다.(Permanent Area 의 경우 GC 라 하지않고 Unloading 이라 부른다.)
주의)
- 수시로 Hot Deploy 가 일어나서 Permanent Area 가 Full 나게되면 Full GC 가 일어나게 된다.
- Loading 해야될 Class 보다 적은 Permanent Size 를 할당할 경우, Full GC 도 수시로 일어나지만 OOME(Out Of Memory Error)가 발생하며 서버가 중단될 수도 있다.
댓글
댓글 쓰기