Java 메모리구조 Heap, Data, Stack
Java 는 Java 코드를 컴파일러를 통해 바이트코드로 변환시킨 뒤 JVM 위에 실행시키는 구조
JVM은 자바 바이트코드를 실행시키는 가상머신으로서 자바가 플랫폼에 독립적으로 실행될 수 있게 한다.
JVM 구조에는 Class Loader, Execution Engine, Garbage Collector, Runtime Data Areas 가 있다.
Class Loader
컴파일러에 의해 바이트코드로 변환된 코드를 Runtime Data Areas 에 클래스 단위로 로드 -> Link 를 통해 적절히 배치시키는 작업
Class Loader 로 인해 동적으로 클래스를 로드할 수 있다.
Execution Engine
Runtime Data Areas 에 배치된 바이트 코드를 실행시키는 역할
메모리에 올라온 코드를 명령어 단위로 실행한다.
Garbage Collector
어플리케이션이 생성한 객체의 생존여부를 판단하여
더 이상 사용되지 않는 객체의 메모리를 반환함으로써
메모리를 자동적으로 관리하는 역할을 한다.
Runtime Data Areas
운영체제로부터 할당받은 메모리를 관리하는 영역.
JVM 에서 관리하는 메모리 영역은
- Method(Static or Class) Area
- Runtime Constant Pool
- Heap Area
- Stack Area
- PC Register
- Native Method Stack Area 으로 나뉜다.
Method (Static or Class) Area
호출한 클래스와 인터페이스에 대한 Runtime Constant Pool, 메소드와 필드, Static 변수, 메소드 바이트 코드 등을 저장한다.
Runtime Constant Pool
Method Area 영역에 포함되는 공간이다. 클래스와 인터페이스 상수, 메소드와 필드에 대한 모든 reference를 저장한다.
Heap Area
런타임에서 동적으로 할당하는 객체를 저장하는 공간이다. new연산을 통해 생성되는 객체와 배열을 저장하며 GC의 주 대상이 된다.
Heap Area 메모리 관리
- Young Generation - 객체가 생성되자마자 저장되는 공간이다. 시간이 지날수록 우선순위가 낮아지며 Old 영역으로 내려가게 된다. 이곳에서 객체가 사라지면 Minor GC 가 발생한다.
- Old Generation - 오래된 객체가 저장되는 공간이다. 이곳에서 객체가 사라지면 Major GC 가 발생한다.
- Permanent Generation - Class Loader 에 의해 로드되는 클래스나 메소드에 대한 Meta 정보가 저장되는 영역이다. Reflection을 이용하여 동적으로 클래스를 로드하는 경우 자주 사용된다.
자바의 Reflection은 JVM에서 실행되는 애플리케이션의 런타임 동작을 검사하거나 수정할 수 있는 기능이 필요한 프로그램에서 사용됩니다.
쉽게 말하자면, 클래스의 구조를 개발자가 확인할 수 있고, 값을 가져오거나 메소드를 호출하는데 사용됩니다.
ex) Object.getClass()
Stack Area
Stack 구조의 저장공간이다. 함수 호출시 발생하는 지역변수, 매개변수, 연산 데이터 등을 저장하는 공간
함수를 호출하면 push를 통해 Stack 에 저장하고 함수 호출이 종료되면 다음 실행할 함수를 pop하여 함수를 실행한다.
스레드 별로 저장공간을 따로 생성하여 관리한다.
PC Register
현재 수행 중이거나 다음에 실행할 인스트럭션 주소를 저장한다.
연산 수행 중 발생하는 데이터를 레지스터에 저장하였다가 CPU가 필요할 때 가져다 쓴다.
스레드 별로 공간을 만들어 관리한다
Native Method Stack Area
자바가 접근할 수 없는 영역은 C와 같은 Low Level 언어로 작성되어 있다.
따라서 Native 코드를 실행시키면서 발생하는 데이터를 Stack 구조로 저장하기 위한 공간이다.
스레드 별로 생성된다.
'gyub's 공부일기 > 그저 내 공부' 카테고리의 다른 글
ListView vs RecyclerView (0) | 2021.04.03 |
---|---|
Lambda식이란 (0) | 2021.04.03 |
제네릭 (0) | 2021.04.01 |
Iterator (0) | 2021.04.01 |
Vector vs ArrayList vs LinkedList (0) | 2021.04.01 |