[Java] JVM & Garbage Collection(GC)

ina·2022년 8월 18일
0
post-thumbnail

JVM(Java Virtual Machine)

  • 자바를 실행하기 위한 가상 기계
    • 자바 가상 기계 : ‘기계'라는 표현이 있지만 하드웨어가 아니고, JDK에 포함되어 있는 소프트웨어
  • 자바 바이트코드(.class파일)를 OS에 상관없이 동작하도록 기계어로 변환하여 전달한다 ⇒ 번역기 역할
    • OS (운영체제) : Windows, Linux, Macintosh …
    • 기계어 : 0,1로 이루어진 컴퓨터가 알아 들을 수 있는 언어

  • 자바의 컴파일 동작 과정

    1. 자바의 프로그램이 실행되면 JVM은 OS로부터 프로그램이 필요로 하는 메모리를 요청하여 할당받는다 ⇒ JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리한다
    2. 자바 컴파일러(javac)명령어를 통해 자바 소스파일(.java)을 읽어 바이트코드 파일(.class)로 변환시킨다
    3. Class Loader를 통해 class파일들을 JVM 내부로 로딩한다
    4. 로딩된 바이트코드 파일(.class)들은 실행 엔진(Execute Engine)을 통해 기계어로 해석된다
    5. 해석된 바이트코드 파일(.class)은 메모리 상(Runtime Data Area)에 배치되어 실질적인 수행을 한다
    6. 이런 실행과정 중에 JVM은 Thread Synchronization 이나 Garbage Collection같은 작업을 수행한다
  • JVM의 구조 중 메모리 구조

    • Method Area(메서드 영역) : 클래스 변수의 이름, 타입, 접근 제어자 등과 같은 클래스와 관련된 정보를 저장한다. 그 외에도 static 변수, 인터페이스 등이 저장된다
    • Heap Area(힙 영역) : new생성자를 통해 생성된 객체와 배열의 인스턴스를 저장한다. 가비지 컬렉터는 힙 영역을 청소하며 메모리를 확보한다
    • Stack Area(스택 영역) : 메서드가 실행되면 스택 영역에 메서드에 대한 영역이 생성된다. 이 영역에 지역변수, 매개변수, 리턴값 등이 저장된다
    • PC Register(PC 레지스터) : 현재 스레드가 실행되는 부분의 주소와 명령을 저장한다
    • Native Method Stack(네이티브 메서드 스택) : 자바 외의 언어로 자겅된 코드를 위한 메모리 영역

가비지 컬렉션(GC: Garbage Collection)

  • JVM의 메모리 관리 기법 중 하나로 시스템에서 동적으로 할당됐던 메모리 영역 중에서 필요 없어진 영역을 회수하여 메모리를 관리해주는 기법
  • 가비지 컬렉션은 언제 동작하는가?
    • OS로부터 할당 받은 시스템의 메모리가 부족한 경우
    • 관리하고 있는 Heap에서 사용되는 메모리가 허용된 임계값을 초과하는 경우
    • 프로그래머가 직접 GC를 실행하는 경우(Java에서는 System.gc()라는 메서드가 있지만 가급적 안쓰는 것이 좋다)
  • 가비지 컬렉션의 동작 원리
    • JVM의 Heap 영역은 Young GenerationOld Generation으로 나눌 수 있다

https://www.waitingforcode.com/off-heap/on-heap-off-heap-storage/read

  • Young Generation

    • 새롭게 생성된 객체가 할당되는 영역이다
    • 대부분의 객체는 도달할 수 없는 상태, 즉 참조되지 않는 상태가 되기 때문에 많은 객체가 이 곳에서 사라진다
      • Eden 영역이 한번 가득 차면 Garbage Collector가 실행되는데 이 때 실행되는 가비지 컬렉션을 Minor GC라고 한다
      • Eden 영역에서 살아남은 객체는 Survval0 혹은 1로 가게 되고, Survival 0과 1 중 하나는 반드시 비어 있다
    • Old Generation
      • Young Generation에서 살아남은(참조값이 유지되는) 객체가 위치하는 영역이다
      • Old Generation이 가득 차면 Garbage Collector가 실행되는데 이 때 실행되는 가비지 컬렉션을 Major GC혹은 Full GC라고 한다
  • 가비지 컬렉션 동작 과정

    1. 새로운 객체가 Eden 영역에 할당 ⇒ 두 개의 Survival 중 하나는 반드시 비워진 상태로 시작된다

    2. Eden 영역이 가득차면 Minor GC가 발생한다

    3. Minor GC에서 참조값이 유지된 객체는 Survival 영역으로 이동 ⇒ 참조값이 존재하지 않는 객체는 Minor GC 중 메모리에서 삭제된다

    4. 다음 Minor GC가 발생하는 시점에, Eden 영역에서는 3번의 과정이 반복된다 ⇒ 기존에 Survival 영역에 위치하던 객체들 중 참조값이 유지된 객체들은 다른 Survival 영역으로 이동하며, 이 때 객체의 age 값이 1 증가한다 ⇒ Survival 영역에서 참조값이 존재하지 않게 된 객체는 메모리에서 삭제된다

    5. 4번의 과정이 반복되며, 이 과정에서 지속적으로 살아 남은 객체 중 age 값이 특정 값 이상인 객체들은 Old Generation으로 옮겨진다 ⇒ Young Generation에서 Old Generation으로 객체가 이동하는 단계를 Promotion이라고 한다

    6. Minor GC의 반복과 Promotion 작업의 반복이 계속 일어나다 보면 Old Generation이 가득차게 된다

    7. 이 때 Major GC가 발생한다

  • 가비지 컬렉션 동작 방식

    • Stop The World
      • 가비지 컬렉션을 수행하기 위해 JVM이 애플리케이션의 실행을 일시 정지 하는 것
      • 가비지 컬렉션이 실행되면 GC 작업을 맡은 스레드를 제외한 나머지 스레드는 모두 멈추고 GC 작업이 종료되면 재개된다
    • Mark and Sweep
      • 애플리케이션이 일시 중지되면 GC는 참조되고 있는 객체와 연결된 객체를 타고 이동하며 접근 가능한 객체를 식별(Mark)하는데 이 과정을 Mark라고 한다
      • 모든 객체 탐색이 끝나면 식별(Mark)되지 않은 객체들을 메모리에서 해제시키는데 이것을 Sweep이라고 한다

참고자료
도서: 혼자 공부하는 자바 - 신용권
블로그 :
신입 개발자 기술면접 질문 정리 - 자바
[기술면접 시리즈] 자바의 컴파일 과정(JVM 메모리 구조)
JVM의 Garbage Collector 동작 원리
[JAVA] GC(Garbage Collection)이란?

profile
🐢 💨 💨

0개의 댓글