[JAVA] 자바/JVM 메모리 구조
Method Area / Static Area 클래스 파일의 바이트 코드가 로드되는 곳 메인 메소드를 호출함으로써 프로그램 시작을 하게 되는데 메인 메소드에서 사용하는 클래스/ Static변수가 이 영역에 올라온다. 메
dvpdvp.tistory.com
GC에 대해 추가로 정리를 해보려 한다.
Garbage Collection 이란?
JAVA의 GC는 다음과 같은 가설을 전재로 도입되었다.
- 대부분의 객체는 금방 접근 불가능 상태 (unreachable)가 된다.
- 오래된 객체에서 젋은 객체로의 참조는 아주 적게 존재한다.
동적으로 할당 된 메모리 영역 가운데 더 이상 사용할 수 없게 된 영역을 탐지하여 자동으로 해제하는 기법이다.
C언어는 free()함수를 통해 직접 메모리 해제를 해주어야 하지만, JAVA의 경우 JVM의 GC가 알아서 정리해준다.
장점
1. 프로그래머가 메모리 영역의 전체를 관리할 필요가 없어진다 -> 고로 생산성이 향상된다.
2. 유효하지 않은 포인터 접근을 막아준다 -> 이미 해제된 메모리에 접근하는 버그를 방지
3. 이중해제 -> 이미 해제된 메모리를 또 다시 해제하는 버그를 방지
4. 메모리 누수 -> 더이상 필요하지 않은 메모리가 해제되지 않고 남아있는 버그
메모리 누수가 반복되면 메모리 고갈로 프로그램이 중단 될 수 있다.
단점
1. 어떤 메모리를 해제할지 결정을 하는데 비용이 든다.
2. GC타이밍이나 점유시간을 예측하기 힘들다 -> 때문에 일시적으로 정지 할 수 있다
3. 2번을 사유로, 실시간 시스템에는 적합하지 않다.
4. 할당된 메모리가 해제되는 시점을 알 수 없다 -> 장점이자 단점. 프로그래머가 알 필요 없다는 뜻이기 때문에 장점으로 생각 되기도 한다.

Minor GC
객체가 최초에 생성되는 위치를 Eden이라고 하는데 (왠지 에덴의 동산에서 따온 것 같다)
이 Eden의 메모리 공간이 꽉차면 참조하고 있지 않는 객체는 메모리 해제가 되고,
참조 되고 있는 객체는 Survivor의 from space로 이동한다.
그 후 또 다시 Eden이 꽉차면 from space와 to space를 가르키는 포인터가 변경되면서
from -> to space로 객체들이 이동된다 ( 이동되는 효과를 준다? 가 맞는듯)
이때 원래 to space에 있던 객체들 중 살아남은 객체는 Old Generation으로 복사된다.
결론은 Eden -> From Space -> To Space -> Old Generation으로 이동된다.
마이너 GC는 빠르고 효율적이며, 쓰레드가 멈추는 등의 부작용도 없다.
하지만 이에도 불구하고 Young Generation이 모두 꽉차게 되면
가용메모리를 확보하기 위해 Major GC가 수행된다.
Major GC
Major GC는 객체들이 Lived상태로 있는지 여부를 확인하기 위해 모든 쓰레드를 멈추고,
Lived가 아니며 사용하지 않는 객체들을 제거하며 힙을 정리한다.
결국 생명주기가 짧은 객체는 minor gc선에서 해제되도록 유도하는게 좋다.
참조
'PROGRAMMING > JAVA' 카테고리의 다른 글
| [JAVA] 출력시 소수점 자리 고정 후 0으로 채우기 (0) | 2021.04.14 |
|---|---|
| [JAVA] GC(Garbage Collection) 이란? (2/2) (0) | 2021.04.12 |
| [JAVA] 자바/JVM 메모리 구조 (0) | 2021.04.03 |
| [JAVA] equals 와 == 비교 (0) | 2021.03.12 |
| [JAVA] JDK 설치 및 환경변수 설정 (0) | 2021.02.16 |