jvm 가비지 컬렉션

가비지 컬렉션(이하 GC)

GC 의 과정

  • GC에 대해서 알아보기전 알아야 용어가 있다. 바로 stop-the-world이다. stop-the-world란 GC를 실행하기 위해 JVM이 어플리케이션 실행을 멈추는 것이다. stop-the-world가 발생하면 GC를 실행하는 쓰레드를 제외한 나머지 쓰레드는 모두 작업을 멈춘다.
    대게의 경우 GC 튜닝이란 이 stop-the-world 시간을 줄이는 것이다.

  • 자바는 프로그램 코드에서 메모리를 명시적으로 해제하지 않는다. 가끔 명시적으로 해제하려고 해당 객체를 null로 지정하거나 System.gc() 메서드를 호출하는 개발자가 있다. null로 지정하는 것은 큰 문제가 안되지만 System.gc() 메서드를 호출하는 것은 시스템의 성능에 큰 영향을 끼치므로 자제 해야 된다.

  • 오라클의 HotSpot VM에서는 크게 2개의 물리적 공간으로 나뉜다. Young 영역Old 영역이다.

    1. Young 영역(Yong Generation 영역)

    • 새롭게 생성한 객체의 대부분이 여기에 위치한다. 대부분의 객체가 금방 접근 불가능 상태가 되기 때문에 많은 객체가 여기서 생성되었다가 사라진다. 이 영역에서 객체가 사라질 때 Minor GC가 발생한다고 한다.
      2. Old 영역(Old Generation 영역)
    • 접근 불가능 상태로 되지 않아 Young 영역에서 살아남은 객체가 여기로 복사된다. 대부분 Young 영역보다 크게 할당되며, 크기가 큰 만큼 Young 영역보다 GC는 적게 발생한다. 이 영역에서 객체가 사라질 때 Major GC(혹은 Full GC)가 발생한다고 한다.
  • 위 그림의 Permanent Generation 영역(이하 Perm 영역)은 Method Area라고도 한다. 객체나 억류(intern)된 문자열 정보를 저장하는 곳이며, Old 영역에서 살아남은 객체가 영원히 남아 있는 곳은 절대 아니다. 이 영역에서 GC가 발생할 수도 있는데 여기서 GC가 발생해도 Major GC의 횟수에 포함된다.

Young 영역의 구성

  • Young 영역은 3개의 영역으로 나뉜다.
    1. Eden 영역
    2. Survivor 영역(2개)
  • Survivor 영역이 2개이기 때문에 총 3개의 영역으로 나뉜다. 각 영역의 처리 절차 순서를 기술하면 다음과 같다.

    1. 새로 생성한 대부분의 객체는 Eden 영역에 위치한다.
    2. Eden 영역에서 GC가 한번 발생한 후 살아남은 객체는 Survivor 영역 중 하나로 이동된다.
    3. Eden 영역에서 GC가 발생하면 이미 살아남은 객체가 존재하는 Survivor 영역으로 객체가 계속 쌓인다.
    4. 하나의 Survivor 영역이 가득차게 되면 그 중에서 살아남은 객체를 다른 Survivor 영역으로 이동한다. 그리고 가득 찬 Survivor 영역은 아무 데이터도 없는 상태로 만든다.
    5. 이 과정은 반복하다가 계속해서 살아남아 있는 객체는 Old 영역으로 이동하게 된다.
  • 이 절차를 확인해 보면 알겠지만 Survivor 영역 중 하나는 반드시 비어 있는 상태로 남아 있어야 한다. 만약 두 Survivor 영역에 모두 데이터가 존재하거나, 두 영역 모두 사용량이 0이라면 정상적인 상황이 아니라고 생각된다.

  • Eden 영역에 최초로 객체가 만들어지고, Survivor 영역을 통해서 Old 영역으로 오래 살아남은 객체가 이동한다는 사실은 꼭 기억하자!!

출처 : hello naver(http://d2.naver.com/helloworld/1329)

jvm 메모리

jvm 메모리

  • jvm에서 메모리 영역인 런타임 데이터 영역의 구조를 그림으로 그리면 다음과 같다.

  • 크게 3부분으로 나눠진다.
    1. 메소드 영역(클래스 영역)

    • 필드나 메서드의 메타데이터 저장
    • static 변수, 메소드 저장
    • 바이트 코드 저장
    • 상수 풀(Constant Pool)

    2. 스택 영역

    • Last In First Out(LIFO)
    • 메서드 호출 시마다 각각의 프레임 생성
    • 메서드 안에서 사용되어지는 값들을 저장
    • 호출된 메서드의 매개변수, 지역변수, 리턴 값 및 연산 시 일어나는 값들을 임시로 저장
      메서드 수행이 끝나면 프레임별로 삭제

    3. 힙 영역

    • new 연산자로 생성된 객체와 배열을 저장하는 공간
    • 클래스 영역에 로드된 클래스만 생성가능
    • GC를 통해 메모리 반환

jvm 이란

jvm 이란

jvm

  • 자바 가상 머신은 자바 바이트코드를 실행할 수 있는 주체이다.
  • 일반적으로 인터프리터나 JIT 컴파일 방식으로 다른 컴퓨터 위에서 바이트코드를 실행 할수 있도록 구현되나 자바 프로세서처럼 하드웨어와 소프트웨어를 혼합해 구현하는 경우도 있다.(이론적으로는 100% 하드웨어 구현도 가능하다. 하지만 비효율적이다)

종류

  • 오라클이 소유한 두 종류의 JVM으로 썬마이크로시스템즈에서 개발된 HotSpot 또 다른 하나는 BAE 시스템에서 개발된 JRockit가 있다.
  • 클린 룸 구현 에는 Kaffe
  • IBM사의 IBM_J9가 있다.
  • 대부분의 경우는 HotSpot을 사용한다.