JVM 이란?

SIMZIPARK·2021년 6월 10일
0

Back-End

목록 보기
1/1

자바프로그램을 실행하기 위해 OS에서 할당받은 메모리 공간인 Java Virtual Machine이라 불리는

JVM의 동작 방식

  1. 자바 파일은 [자바컴파일러]를 통해 바이트코드(이하 클래스 파일)로 컴파일 된다.
  2. [클래스로더]는 컴파일된 클래스파일을 JVM으로 로드하고, 로드된 바이트코드는 [엑스큐션 엔진]에 의해 기계가 실행가능한 형태로 변경되어 실행된다.
  3. 그리고 JVM내의 메모리 공간인 [런타임 데이터 영역]은 크게 [프로그램 카운터, PC 레지스터], [JVM, 혹은 자바 스택], [네이티브 메소드 스택], [힙], 그리고 [메소드] 총 5개의 영역으로 구성된다.
    스레드가 생성될 때 마다 [PC 레지스터]+[자바 스택]+[네이티브 메소드 스택]가 생성되고, 스레드간에 공유는 되지 않는다.
    [힙], [메소드]영역은 모든 스레드가 공유하는 공간이다.

런타임 데이터 영역

1. PC(프로그램 카운터) 레지스터

: 스레드가 생성될 때 마다 함께 생성되는 영역으로, 현재 스레드가 실행되는 부분의 주소와 명령을 저장하는 영역. 현재 수행중인 JVM 명령의 주소를 갖는다.

2. JVM 스택 혹은 자바 스택

: 지역변수, 파라미터 등에 사용되는 임시 값 등이 생성된다. 메소드를 호출할 때마다 개별적으로 스택이 생성된다.
: 프로그램 실행 과정에서 임시로 할당되었다가 메소드를 빠져나가면 바로 소멸되는 특성의 데이터를 저장하기 위한 영역이다.메소드 호출 시마다 그 메서드만을 위한 "스택 프레임"이 각각 생성되고, 메소드가 끝나면 "스택 프레임"을 삭제한다.
예1) "int a = 10" 이라는 소스코드는 정수(int)가 할당될 수 있는 메모리 공간을 "a"라고 잡아두고, 그 메모리 공간 영역에 값으로 10을 넣는다.
예2) "Class class = new Class()"라는 소스코드는 "Class class"는 스택영역에 생성되고, new로 생성된 Class의 인스턴스는 힙 영역에 생성된다.

3. 네이티브 메소드 스택

: C/C++등의 자바 외의 언어로 작성된 네이티브 코드를 수행하기 위한 메모리 공간이다.
: 커널이 스택을 잡아 독자적으로 프로그램을 실행시키는 영역이다.

4. 힙

: new키워드로 생성된 객체와 배열이 생성되는 영역으로, [new/young], [old], 그리고 [퍼머넌트] 영역으로 구성되어있다.
: 메소드(클래스) 영역에 저장된 클래스들만 힙 영역에 객체로 생성할 수 있다.
: 퍼머넌트 제너레이션 - 생성된 객체의 주소값이 저장된 공간으로, 클래스/메소드에 대한 메타 정보가 저장된다.
: 리플렉션을 사용해 클래스를 동적으로 로딩하는 경우에 사용된다.
: new 제너레이션 - 에덴 : 객체들이 최초로 생성되는 공간 / 서바이버0, 1 : 에덴에서 참조되는 객체들이 저장되는 공간
: old 제너레이션 - 마이너 GC가 한번 발생 후 살아남은 객체는 서바이버 영역으로 이동되는데, 이 과정을 반복하다 계속 살아남는 객체는 Old 영역으로 이동된다.

GC(가비지 컬렉션)

  • Minor GC : New 영역에서 일어나는 GC
  1. 최초에 객체가 생성되면 Eden영역에 생성된다.
  2. Eden영역에 객체가 가득차게 되면 첫 번째 CG가 일어난다.
  3. survivor1 영역에 Eden영역의 메모리를 그대로 복사된다. 그리고 survivor1 영역을 제외한 다른 영역의 객체를 제거한다.
  4. Eden영역도 가득차고 survivor1영역도 가득차게된다면, Eden영역에 생성된 객체와 survivor1영역에 생성된 객체 중에 참조되고 있는 객체가 있는지 검사한다.
  5. 참조 되고있지 않은 객체는 내버려두고 참조되고 있는 객체만 survivor2영역에 복사한다.
  6. survivor2영역을 제외한 다른 영역의 객체들을 제거한다.
  7. 위의 과정중에 일정 횟수이상 참조되고 있는 객체들을 survivor2에서 Old영역으로 이동시킨다.
  8. 위 과정을 계속 반복, survivor2영역까지 꽉차기 전에 계속해서 Old로 비움
  • Major GC(Full GC) : Old/Perm 영역에서 일어나는 GC
  1. Old 영역에 있는 모든 객체들을 검사하며 참조되고 있는지 확인한다.
  2. 참조되지 않은 객체들을 모아 한 번에 제거한다.
  3. Minor GC보다 시간이 훨씬 많이 걸리고 실행중에 GC를 제외한 모든 쓰레드가 중지한다.
  • Major GC(Full GC)가 일어나면,
    Old영역에 있는 참조가 없는 객체들을 표시하고 그 해당 객체들을 모두 제거하게 된다.
    그러면서 Heap 메모리 영역에 중간중간 구멍(제거되고 빈 메모리 공간)이 생기는데 이 부분을 없애기 위해 재구성을 하게 된다. (디스크 조각모음처럼 조각난 메모리를 정리함)
    따라서 메모리를 옮기고 있는데 다른 쓰레드가 메모리를 사용해버리면 안되기 때문에 모든 쓰레드가 정지하게 되는 것이다.
  • 참조되고있는 객체란?
    참조사슬 중 루트 셋 오브 레퍼런스(최초에 참조)
  1. JVM 스택(자바스택) 메소드 실행 시에 사용하는 지역변수와 파라미터에 의한 참조
  2. 네이티브 메소드 스택에 의해 생성된 객체에 의한 참조
  3. 메소드 영역의 정적(static) 변수에 의한 참조

5. 메소드(클래스, 스태틱) 영역

: 클래스 멤버 변수의 이름, 데이터 타입, 리턴 타입, static 변수, final class 변수 등이 생성되는 영역
: 클래스 정보를 처음 메모리공간에 올릴 때, "초기화 되는 대상을 저장하기 위한" 메모리 공간.
: Runtime Constant Pool 이라는 별도의 관리 영역이 존재하여 상수 자료형을 저장해서 참조하고, 중복을 막는 역할을 한다.
: 클래스에 대한 정보를 저장하는 영역으로, "필드 정보 : 멤버변수명, 데이터타입, 접근제어자 정보", "메소드 정보 : 메소드명, 리턴타입, 매개변수, 접근제어자", "타입 정보 : 클래스인지, 인터페이스인지, 슈퍼클래스의 전체 이름 등" 정보를 저장한다.

메소드 영역이 클래스에 관한 정보를 위한 공간이라면,
힙 영역은 객체를 위한 공간이다.
두 영역 모두 GC(가비지 콜렉션) 대상 영역이다.

참고자료
자바가상머신이란 무엇인가?
JVM구조와 자바 런타임 메모리 구조

profile
이겨내야쥐

0개의 댓글