자바의 메모리 구조에 앞서 실제 자바가 어떤 식으로 동작되는지에 대한 이해가 필요하다.
우리가 java 파일을 작성하여 javac 컴파일러에 의해 컴파일 하면 .class의 바이트 코드를 생성한다.
이러한 바이트 코드를 Class Loader를 통해 JVM에 적재하고 Execution Engine에 의해 실행 중 메모리를 관리하고 Garbage Collector에 의해 Heap 영역에서 사용되지 않는 메모리를 해제하는 구조를 지닌다.
1. Class Loader
.class의 바이트 코드를 엮어서 JVM의 Runtime Data area에 적재하는 역할을 한다.
2. Execution Engine
.class의 바이트 코드들을 기계어로 번역하여 실행 단위의 명령어로 실행한다.
(이 때, 명령어를 하나씩 번역하며 실행하는 인터프리터 방식과
적절한 시간에 바이트코드를 원시코드로 컴파일하여 수행하는 JIT(Just In Time) 방식이 있다)
3. Garbage Collector
GC는 Runtime Data area의 Heap 영역에서 참조되지 않는 객체들을 해제하는 역할을 한다. 언제 이러한 역할을 수행하는지 보장할 수 없다. 그리고 GC를 수행하는 쓰레드 외에 다른 쓰레드는 정지를 함.
4. Runtime Data Area
1) Method Area(Class Area)
App이 실행될때 생성된 Class, Static 변수, Final Class 등의 정보가 저장되는 공간.
구체적으로 메소드의 정보(이름, 반환형, 매개변수, 접근제어자), 클래스의 정보(접근제어자, 타입정보, 멤버 변수, 메소드 등), 상수 등의 정보가 저장된다.
2) Heap Area
Method 영역에 생성된 클래스들의 객체를 new 키워드를 통해 생성될 때 할당되는 공간
3) Stack Area
지역 변수, 매개 변수, 반환값, 연산 등에 활용되는 공간.
메소드가 새로 불릴 때마다 개별적으로 Stack 공간이 구성된다.
4) PC Register
쓰레드가 생성될 때 할당되는 공간
현재 실행 중인 쓰레드의 메모리 주소값이 들어있어 스레드를 교환해가며 사용가능
5) Native Stack Area
Java 이외의 언어로 작성된 원시코드를 위한 공간
C/C++을 수행하기 위한 Stack
참조 : https://jeong-pro.tistory.com/148
'Archived(CSE Programming) > Java' 카테고리의 다른 글
Java 깊은 복사와 얕은 복사 (2) | 2019.11.03 |
---|---|
Java 마커 인터페이스 (0) | 2019.11.03 |
Java 예외처리 (0) | 2019.11.03 |
Java 컬렉션(Collection) (0) | 2019.11.03 |
Java 추상클래스, 인터페이스 (0) | 2019.11.03 |