Java JVM(Java Virtual Machine) & GC(Garbage Collection)

1. JVM(Java Virtual Machine)

JVM을 살펴보기전에 Java에서 사용되는 용어들을 정리하고 진행하겠습니다.

  • JDK: Java SE Development Kit
    자바 개발 키트, JRE+컴파일러, 디버거 등의 개발도구

  • JRE: Java SE Runtime Environment
    자바 구동 환경, JVM+시스템 라이브러리

  • JVM: Java Virtual Machine
    자바 가상 머신, 운영체제 독립적으로 동작하기 위해 필요

  • IDE: Integrated Development Environment
    통합 개발 환경

  • API: Application Programming Interface
    JAVA에서 기본으로 제공하는 클래스들의 모음

JVM(Java Virtual Machine)이란

Java Virtual Machine이며 Java의 바이트코드를 실행할 수 있는 주체이며 운영체제위에서 동작하는 프로세스로 Java코드를 컴파일해서 얻은 Byte코드를 운영체제가 이해할 수 있는 기계어로 바꾸어주는 역할을 진행합니다.

JVM 동작과정

JVM

JVM은 총 4가지로 구성되어지는데 Class Loader, Execution Engine, Garbage Collector, Runtime Data Area로 구성되어집니다.

(1) Java에서 소스코드를 작성하면 .java파일이 생성되는데 이 자바파일을 Java Complier가 Compile을 진행하면 .class 파일을 생성시킵니다. 여기서 .class파일은 바이트 코드입니다.

(2) 클래스 파일들을 바탕으로 Class Loader는 JVM이 운영체제로 부터 할당된 메모리영역인 Runtime Data Area로 적재하는 역할을 진행하게됩니다.

(3) 이제 Execution Engine에 의해 Class Loader에 의해 메모리에 적재된 클래스 바이트코드를 기계어로 변경해 명령어 단위로 실행하는 역할을 진행합니다.
명령어 실행 방식: 인터프리터(Interpreter) - 한줄한줄 읽어들이는 방식, JIT(Just-in-Time) 컴파일러 이용 - 전체바이트 코드를 네이티브 코드로 변경하여 실행 성능을 높이는 방식

(4) Garbage Collector는 Heap 메모리 영역에 생성된 객체중에 참조되지 않은 객체들을 탐색후 제거하는 역할을 진행합니다.
또 다른 특징은 GC가 수행되는 동안 GC를 수행하는 쓰레드가 아닌 모든 쓰레드가 일시정지되며 Full GC가 일어나서 모든쓰레드가 정지된다면 장애로 이어질 수 있는 치명적인 단점이 발생합니다.

(5) Runtime Data Area는 JVM의 메모리 영역으로 자바 애플리케이션을 실행할때 사용하는 데이터들을 적재하는 영역이 됩니다.

Runtime Data Area 구조

  • (1) Method Area

클래스 멤버 변수이름, 데이터타입, 접근제어자 정도, 메소드이름, 리턴타입, 파라미터, 접근제어자 정보, static 변수

  • (2) Heap Area

객체의 배열이 생성되는 영역(new Keyword)이며 메소드영역에 로드된 클래스만 생성이 가능하고 Garbage Collector가 참조되지 않는 메모리를 확인하고 제거하는 영역(객체생성시 new부분은 Stack Area에 참조값을 가진다.)

  • (3) Stack area

지역 변수, 파라미터, 리턴 값, 연산에 사용되는 임시 값등이 생성되는 영역(객체생성시 선언부분)

  • (4) PC(Program Counter) Register

Thread 생성시 마다 생성되는 영역으로 주소와 명령어 저장하는 영역

(5)Native method stack
자바 이외의 언어 네이티브 코드를 위한 메모리영역이며 C/C++등을 예로 들 수 있다.

스택영역은 공유되지 않으며 힙같은경우는 스레드로 공유가 가능합니다

참조링크

Thread & Process

2. GC(Garbage Collector)

GC

Heap Area는 GC의 주요 대상이며 힙 영역은 eden, survivor1, survivor2, old, permanent로 구성이 되어집니다. 이렇게 힙 영역이 나누어진 이유는 효율성 때문입니다.

GC의 종류

Minor GC, Major GC

GC의 특징

  • Minor GC

최초의 객체가 생성되면 Eden영역에 생성이 되며 Eden영역에 객체가 가득차게되면 첫번째 GC가 일어나게됩니다. 그리고 survivor1 영역에 Eden 영역의 메모리가 그대로 복사되며 survivor1 영역을 제외한 다른 영역의 객체를 제거하게 됩니다.

Eden영역과 survivor1영역이 메모리에 가득차게 되면 Eden영역에 생성된 객체와 survivor1에 생성된 객체중에 참조되고 있는 객체가 있는지 검사하게 됩니다.

참조되고 있지 않은 객체는 내버려두고 참조되는 객체만 survivor2에 복사하여 진행합니다. 그리고 survivor2 영역을 제외한 다른 영역의 객체들을 제거합니다.

  • Major GC(Full GC)
    Old영역에서 일어나는 GC이며 old영역에 있는 모든 객체들을 검사하여 참조되고 있는지를 확인합니다. 그리고 참조되지 않는 객체들을 모아 한꺼번에 제거를 진행합니다.(Minor GC에 비해 비용이 많이 들고 GC를 제외한 쓰레드 중지)

참조
Major GC는 참조가 없는 객체들을 표시하고 그 해당 객체들을 모두제거하게됩니다. 그리고 Heap 메모리 영역에 비어진 메모리들의 값을 재 구성을위하여 쓰레드를 중지시키는 원리입니다.

reference

https://d2.naver.com/helloworld/1230
https://jeong-pro.tistory.com/148