JVM GC

제공

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 발생횟수는증가한다.

코멘트

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다