본 블로그에서는 JVM 메모리 구조에 대해서만 정리하였습니다.
- JVM 이란? (첨부 예정)
JVM은 크게 4가지 영역으로
Class Loader, Execution Engine, Garbage Collector, Runtime Data Area로 나뉜다.
자바로 개발된 프로그램을 실행하면 JVM은 OS로부터 메모리를 할당합니다.
자바 컴파일러(javac)가 자바 소스코드(.java)를 자바 바이트코드(.class)로 컴파일합니다.
Class Loader를 통해 JVM Runtime Data Area로 로딩
합니다.
(Class Loader System : 컴파일된 자바 클래스 파일을 메모리(Runtime Data Area)에 적재
한다)
Runtime Data Area에 로딩 된 .class들은 Execution Engine을 통해 해석합니다.
해석된 바이트 코드는 Runtime Data Area의 각 영역에 배치되어 수행하며 이 과정에서 Execution Engine에 의해 GC의 작동과 스레드 동기화가 이루어집니다.
Runtime Data Area(자바의 메모리 영역) :
JVM이 프로그램을 수행하기 위해 운영체제로부터 할당 받는 메모리 영역
(애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역이다)
런타임 시 JVM에 할당되는 메모리 영역으로 크게 5가지 영역(JDK8 이상)
Method Area, Heap Area, Stack Area, PC Register, Native Method Stack로 나뉜다.
(아래 3개의 이미지는 모두 동일한 내용이나 이해를 돕기위해 여러개의 표를 삽입했습니다)
( 좌측 3개는 스레드 별로 생성, 우측 2개 영역은 모든 스레드가 공유)
동적으로 할당
되는 영역static 변수는 Method Area의 Class Variable에 저장
기본형이 아닌 static 클래스형 변수는 레퍼런스 변수만 저장되고 실제 인스턴스는 Heap에 저장되어 있다. 그 후 이 인스턴스의 변수를 저장하기 위해 Heap에 메모리가 확보가 되고 Heap의 인스턴스가 Method Area의 어느 클래스 정보와 연결되는지 설정 하게 된다.
참고
- https://velog.io/@agugu95/%EC%9E%90%EB%B0%94%EC%99%80-JVM-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B5%AC%EC%A1%B0
- https://codybuilder.com/19
- https://jithub.tistory.com/40
- https://jithub.tistory.com/296
- https://www.holaxprogramming.com/2013/07/16/java-jvm-runtime-data-area/
- https://swk3169.tistory.com/192