JVM 안에서는 무슨 일이 일어나고 있는가? - Runtime Data Area 편

Jay Jang·2022년 6월 20일
0

JVM

목록 보기
3/3

JVM 안에서는 무슨 일이 일어나고 있는가?



출처: The JVM Architecture Explained - DZone Java

JVM은 크게 세 가지 Main subsystem 으로 나눌 수 있다.

1. ClassLoader(클래스 로더)
2. Runtime Data Area
3. Execution Engine


출처: #자바가상머신, JVM(Java Virtual Machine)이란 무엇인가? (tistory.com)



Runtime Data Area 런타임 데이터 영역



출처: 자바 메모리 구조(Runtime Data Area) :: 찐코딩노예 (tistory.com)

Runtime Data Area(런타임 데이터 영역) 은 JVM이 프로그램을 수행하기 위해 운영체제로부터 할당받는 메모리 영역이다.

WAS(Web Application Server)의 성능에 문제가 발생했을 때, 대부분 이 영역이 원인이 된다. (Memory Leak or GC)

런타임 데이터 영역5개의 주요 영역으로 나눌 수 있다.

좌측 3개의 영역은 Thread 별로 생성되고, 우측 2개의 영역은 모든 Thread가 공유(프로세스 단위) 한다.


출처: What Are Runtime Data Areas? (herongyang.com)


PC Register (Thread 별로 1개씩 존재)


각각의 스레드마다 개별 PC Register가 존재한다.

스레드가 어떤 부분을 어떤 명령으로 실행해야할 지에 대한 기록을 하는 장치로 현재 수행중인 JVM 명령의 주소를 갖는다.

또한 Java의 PC Register는 CPU 내의 기억장치인 레지스터와는 다르게 작동한다 (Register-Base가 아닌 다른 Stack-base로 작동)

JVM Stack (Thread 별로 1개씩 존재)


각각의 스레드마다 개별 스택영역이 존재한다.

각종 형태의 변수나 임시 데이터, 스레드나 메소드의 정보를 저장한다.

메서드가 호출될 때마다 메소드 콜스택이 스택 프레임이라는 스택 메모리에 쌓이게 되고, 메서드 수행이 끝나면 프레임 별로 삭제한다.

모든 지역변수는 스택 영역에 쌓인다. 예를 들어 메서드의 매개변수, 지역변수, 리턴 값 및 연산 시 일어나는 값들을 임시로 저장한다

스택 영역은 세가지 서브엔티티로 나누어진다.


  • 지역변수 배열 Local Variable Array
    메서드가 얼마나 많은 지역변수를 포함하고, 해당 값 정보가 저장된다.

  • 피연산자 스택 Operand Stack
    중간연산이 필요할 때, 연산작업을 수행하기 위한 작업공간 역할을 한다.

  • 프레임 데이터 Frame Data
    메서드에 상응하는 모든 심볼(참조자)가 이곳에 저장된다.



Native Method Stacks (Thread 별로 1개씩 존재)


Java 프로그램이 컴파일되어 생성되는 바이트코드가 아닌 실제 실행할 수 있는 기계어로 작성된 프로그램을 실행시키는 영역

Java가 아닌 다른 언어로 작성된 코드를 위한 공간이다.

Java Native Interface (JNI) 를 통해 호출하여 바이트코드로 전환하여 저장하게 된다.(ex. C/C++ 등의 코드, Thread.currentThread())

일반 프로그램처럼 커널이 스택을 잡아 독자적으로 프로그램을 실행시키는 영역

Heap Area (모든 Thread가 공유)



출처: [JAVA] JVM이란? 개념 및 구조 (JDK, JRE, JIT, 가비지 콜렉터...) (tistory.com)

객체 인스턴스와 배열을 동적으로 생성하는 공간.

또한 Garbage Collection의 대상이 되는 영역이다

Heap 영역에서 Garbage Collect가 동작하기에 개발자는 객체를 제거하기 위해 별도의 코드를 작성할 필요가 없다. 오히려 부작용만 낳을 가능성이 크다.

모든 Thread가 공유하기 때문에 동기화 문제가 발생할 가능성이 있음.

Class Area 클래스 영역 (정적 영역) 에 올라온 클래스들만 객체로 생성할 수 있다.

힙은 세 부분으로 나누어진다.

Permanent Generation


생성된 객체들의 정보의 주소값이 저장된 공간이다. 클래스 로더에 의해 load 되는 Class, Method 등에 대한 Meta 정보가 저장되는 영역이고 JVM에 의해 사용된다.

Reflection을 사용하여 동적으로 클래스가 로딩되는 경우에 사용된다.

Reflection
객체를 통해 클래스의 정보를 분석해 내는 프로그래밍 기법
구체적인 클래스 타입을 알지 못해도, 컴파일된 바이트 코드를 통해 역으로 클래스의 정보를 알아내어 사용할 수 있다는 뜻이다.

New/Young 영역

이곳의 인스터스들은 추후 가비지 컬렉터에 의해 사라진다.

생명 주기가 짧은 “젊은 객체”를 GC 대상으로 하는 영역이다.

여기서 일어나는 가비지 컬렉트를 Minor GC라고 한다.

Eden: 객체들이 최초로 생성되는 공간

Survivor 0, 1: Eden에서 참조되는 객체들이 저장되는 공간

  • Eden 영역에 객체가 가득차게되면 첫번째 가비지 컬렉트가 발생한다.
  • Eden 영역에 있는 값들을 Survivor 1 영역에 복사하고 이 영역을 제외한 나머지 객체를 삭제한다.

Old 영역


이곳의 인스턴스들은 추후 가비지 컬렉터에 의해 사라진다.

생명 주기가 긴 “오래된 객체” 를 GC 대상으로 하는 영역이다.

여기서 일어나는 가비지 컬렉트를 Major GC 라고 한다.

Minor GC에 비해 속도가 느리다.

New/Young Area 에서 일정시간 참조되고 있는, 살아남은 객체들이 저장되는 공간이다.

Method Area (=Class Area, Static Area) (모든 Thread가 공유)


Class Loader가 적재한 클래스(또는 인터페이스)에 대한 메타데이터 정보가 저장된다.

이 영역에 등록된 Class만이 Heap에 생성될 수 있다.

(작성중)

REFERENCE


Java Garbage Collection Basics (oracle.com)
Java virtual machine - Wikipedia
What is the JVM? Introducing the Java Virtual Machine | InfoWorld
The JVM Architecture Explained - DZone Java
Working with the JVM | Clojure for the Brave and True (braveclojure.com)
자바 메모리 관리 - 가비지 컬렉션 (yaboong.github.io)
자바 메모리 구조(Runtime Data Area) :: 찐코딩노예 (tistory.com)
[JAVA] JVM이란? 개념 및 구조 (JDK, JRE, JIT, 가비지 콜렉터...) (tistory.com)
#자바가상머신, JVM(Java Virtual Machine)이란 무엇인가? (tistory.com)

profile
그때는맞고지금은틀리다

0개의 댓글