JVM(Java virtual machine)
자바 기반 애플리케이션을 실행하기 위한 가상머신. 자바를 운영체제 종류에 상관없이 독립적으로 Java 프로그램이 실행됨
C언어에서는 free를 이용하여 메모리를 수동으로 수거해야 했지만, JVM에서는 GC가 자동으로 그 역할을 수행한다. 단점으로는 GC가 수행되는 동안 애플리케이션이 일시 정지됨.
객체를 만들면 메모리에 저장된다.
객체의 ID값을 가지고 있는 변수가 하나도 없거나 null이면 소멸의 대상이 된다.
메모리 청소 시점
JVM이 메모리가 부족하다고 판단하는 경우
OS가 메모리가 부족하다고 판단하는 경우
프로그램이 종료된 경우
개발자가 코드를 통해 메모리 청소 명령을 날릴 경우

GC(Garbage Collector)
쓰레기를 모아 수집한다는 뜻으로, 어플리케이션이 생성한 객체의 생존 여부를 판단하여, 더 이상 참조되지 않거나 null인 객체의 메모리를 해제시켜 메모리 반납을 한다.

MinorGC
Young Generation에서 메모리 수거하는 역할을 한다.
새로 생성한 객체는 Eden 영역에 위치한다. Eden영역이 가득차게되면 Minor GC가 발생한다. Eden 영역에서 사용되지 않는 객체의 메모리가 해제되고 살아남은 객체는 survivor1으로 이동된다. Survivor 1, 2를 15번 정도 왕복하게 되면 Tenured(Old) 영역으로 이동하게 된다.
MinorGC는 0.5초 이내로 수행되므로 큰 문제가 되지 않음.
MajorGC : Old영역에서 발생하는 GC
FullGC : Young과 Old 영역 전반에 걸쳐서 발생하는 GC
jstat -gccause : GC이벤트의 원인정보, LGCC 마지막GC원인, GCC 현재 GC원인
jstat -gc : GC와 관련된 통계 데이터
FullGC가 발생하는 이유
GC가 더 이상 사용하지 않는 객체만 회수하기 때문에, 두번 다시 사용하지 않는 객체라 할지라도, 객체에 접근할 수 있는 경로가 하나라도 남게 되면 GC는 객체를 사용할 가능성이 있다고 판단하고 회수하지 않는다. 이러한 방식으로 회수되지 않는 객체가 쌓이게 된다면 FullGC가 발생하게 된다.
Heap memory
애플리케이션 실행 중에 생성되는 객체를 저장하는 영역(GC에 의해 관리됨)
STW(Stop-the-world)
GC를 실행하기 위해 JVM이 애플리케이션 실행을 멈추는 것.
모든 객체의 유효성을 검사하고 불일치된 참조를 수정해야하는 과정중에는 애플리케이션이 일시 정지된 상태에서 이루어져야 한다.
힙 구조를 최적화하기 위해 객체를 이동시키거나 크기를 조정하는 작업을 수행해야 하는데 STW상태에서 이루어져야 한다.
일관된 힙 상태를 보장하기 위해 일시 정지 상태에서 힙 상태를 동기화나다.
GC를 완료한 후에 중단했던 작업을 다시 시작한다.
- 메모리크기가크면
- GC 발생횟수는줄어든다.
- GC 수행시간은길어진다.
- 메모리크기가작으면
- GC 수행시간은적어진다.
- GC 발생횟수는증가한다.
답글 남기기