JVM동작원리

박태훈 ·2024년 10월 23일

면접복기

목록 보기
1/2

JVM

면접때 답변을 제대로 하지 못한 질문중 하나이다.
JVM이라고 하면 그냥 가비지컬렉터가 대충 메모리 관리하는거 아닌가 라고 생각했다.
실제로 뭐 이걸 제대로 다룬적도 없고 자바공부할때도 자바의 특성중 하나로 알고있었다.
오늘은 JVM의 특징과 동작과정 동작원리를 한번 정리해보려고한다.

그래서 JVM이 뭔데?

Java Virtual Machine의 줄임말이다.
자바 언어로 작성한 프로그램을 실행시키기 위한 가상머신이다.
자바로 코드를 작성하면 JVM위에서 동작한다.
가상머신은 프로그램 실행 등을 위해 물리적 머신과 비슷하게 소프트웨어로 구현한것이다.

특징


  1. 컴파일
    JVM을 사용하지 않는 다른언어들은 컴파일시 OS 별로 다르게 출력되는 경우가 존재한다.

    컴파일은 프로그래밍 언어를 컴퓨터가 알아들을수 있게 바이트단위로 표현해주는 작업을 의미한다. 자바는 컴파일을 JVM에서 하기 떄문에 OS 상관없이 동일한 값을 출력해낸다. 다른언어들은 각 OS별 컴파일러를 설치하지 않으면 출력결과가 다름. 그래서 JVM은 다른언어에서도 사용하곤한다(Kotlin)

  1. 가비지컬렉터
    사용하지 않는 객체의 메모리를 자동으로 관리해주는 기능이다.
    왜 메모리를 정리할까??
    사용하지 않는 객체가 메모리를 점유할 경우 결국 메모리 누수로 이어진다.
    메모리는 한정된 자원이기 떄문에 사용하지 않거나 필요가 없는 부분은 해제를 해주는게 맞음.

동작방식

자바 프로그램의 흐름도이다. 자바 컴파일러에 의해 자바 소스 파일은 바이트 코드로 변환된다. 바이트 코드를 JVM에서 읽은 다음 프로그램을 실행할 수 있도록 만든다.

JVM메모리 구조

자바 프로램의 실행 단계다. 총 4자지로 구성되어있다.

(1) Class Loader
JVM 내로 클래스 파일을 로드, 링크를 통해 배치하는 작업을 수행하는 모듈, 런타임 시 동적으로 클래스를 로드한다.

(2)Excution Engine
클래스 로더를 통해 JVM 내 RuntimeDate Area에 배치된 바이트 코드들을 명령어 단위로 읽어서 실행한다. JIT컴파일러 방식으로 실행한다.

(3)Garbage Collector(GC)
GC는 힙 메모리 영역에 생성된 객체들 중 참조되지 않은 객체들을 탐색 후 제거하는 역할을 한다.

(4)Runtime Data Area
JVM메모리 영역, 자바 애플리케이션을 실행할때 사용되는 데이터들을 적재하는 영역이다.

(1)Method area
모든 쓰레드가 공유하는 메모리 영역, 메소드 영역은 클래스, 인터페이스, 메소드, 필드, Static 변수 등의 바이트 코드를 보관한다.

(2)Heap area
모든 쓰레드가 공유, new 키워드로 생성된 객체와 배열이 생성되는 영역, 메소드 영역에 로드된 클래스만 생성이 가능, GC가 참조되지 않는 메모리를 확인하고 제거하는 영역이다.

(3)Stack area
메소드 호출 시마다 각각의 스택 프레임이 생성된다. 그리고 메서드 안에서 사용되는 값들을 저장, 호출된 메서드의 매개변수, 지역변수, 리턴 값 및 연산 시 일어나는 값들을 임시로 저장한다.
int a = 10; 변수 선언시 정수값이 할당될 수 있는 메모리공간을 a 라고 잡고 메모리 영역에 값이 10이 들어간다. 스택에 a라는 이름이 붙고 값이 10인 메모리 공간을 만든다.
클래스 Person P = new Person(); 소스 작성시 Person P 는 스택 영역에 생성 new 로 생성된 Person 쿨래스의 인스턴스는 힙 영역에 생성된다.
그리고 스택영역에 생성된 p의 값으로 힙 영역의 주소값을 가지고 있다. 스택 영역에 생성된 p가 힙 영역에 생성된 객체를 가리키고 있는 것임.
메소드 호출시 개별적으로 스택이 생성된다.

(4)PC Register
Thread가 생성될때마다 생성되는 영역이다. 쓰레드가 실행되는 부분의 주소와 명령을 저장하고 있는 영역이다.

(5)Native method stack
자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역이다.

Heap 영역은 GC의 주요 대상이다.


GC동작원리

GC는 Minor GC, Major GC로 나뉨

  1. 최초에 객체가 생성되면 Eden영역에 생성된다.
  2. Eden영역에 객체가 가득차게 되면 첫 번째 CG가 일어난다.
  3. survivor1 영역에 Eden영역의 메모리를 그대로 복사된다. 그리고 survivor1 영역을 제외한 다른 영역의 객체를 제거한다.
  4. Eden영역도 가득차고 survivor1영역도 가득차게된다면, Eden영역에 생성된 객체와 survivor1영역에 생성된 객체 중에 참조되고 있는 객체가 있는지 검사한다.
  5. 참조 되고있지 않은 객체는 내버려두고 참조되고 있는 객체만 survivor2영역에 복사한다.
  6. survivor2영역을 제외한 다른 영역의 객체들을 제거한다.
  7. 위의 과정중에 일정 횟수이상 참조되고 있는 객체들을 survivor2에서 Old영역으로 이동시킨다.- 위 과정을 계속 반복, survivor2영역까지 꽉차기 전에 계속해서 Old로 비움

Major GC(Full GC) : Old 영역에서 일어나는 GC

  1. Old 영역에 있는 모든 객체들을 검사하며 참조되고 있는지 확인한다.
  2. 참조되지 않은 객체들을 모아 한 번에 제거한다.
  • Minor GC보다 시간이 훨씬 많이 걸리고 실행중에 GC를 제외한 모든 쓰레드가 중지한다.

  • Major GC(Full GC)가 일어나면,
    Old영역에 있는 참조가 없는 객체들을 표시하고 그 해당 객체들을 모두 제거하게 된다.
    그러면서 Heap 메모리 영역에 중간중간 구멍(제거되고 빈 메모리 공간)이 생기는데 이 부분을 없애기 위해 재구성을 하게 된다. (디스크 조각모음처럼 조각난 메모리를 정리함)따라서 메모리를 옮기고 있는데 다른 쓰레드가 메모리를 사용해버리면 안되기 때문에 모든 쓰레드가 정지하게 되는 것이다.


정리

  1. JVM은 자바 언어로 작성된 프로그램 파일을 실행시키기 위한 가상머신임.
  2. 컴파일러 와 GC 기능을 실행할수 있다.
  3. JVM의 메모리 영역중 힙 영역에서 GC 가 실행된다.
  4. GC는 Minor GC와 Major GC로 나뉜다.

참고

https://jeong-pro.tistory.com/148
https://backendcode.tistory.com/161

profile
아직말하는감자개발자

0개의 댓글