java Memory 구조에 대해서
왜 프로그램의 메모리를 고려해야 할까?
- 메모리 설계가 잘 되어 있는 프로그램
- 그렇지 않은 프로그램
1번 프로그램에 비해 2번 프로그램에서는 속도 저하 현상이나 튕김 현상이 일어날 확률이 크다.
보다 안정적인 프로그램을 개발하려면 메모리 구조를 이해하고 적절하게 사용할 수 있어야 한다.
JVM 이란?
JVM메모리 구조를 설명하기 전에 JVM이 무엇인지 알아야 한다.
JVM은 Java Virtual Machine의 약자이고 자바 가상 머신이라고 부른다.
자바와 운영체제 사이에서 중개자 역할을 수행하며, 자바가 운영체제에 구애받지 않고 프로그램을 실행할 수 있도록 도와줍니다.
또한, 카비지 컬렉터를 사용한 메모리 관리도 자동으로 수행하며, 다른 하드웨어와 다르게 레지스터 기반이 아닌 스택 기반으로 동작합니다.
먼저, 자바 컴파일러에 의해 자바 소스파일은 바이트 코드로 변환됩니다.
그리고 이러한 바이트 코드를 JVM에서 읽어 들인 다음에, 이것저것 복잡한 과정을 거쳐서 어떤 운영체제든간에 프로그램을 실행할 수 있도록 만드는 것입니다.
만약, 자바 소스파일은 리눅스에서 만들었고 윈도우에서 이 파일을 실행하고 싶다면, 윈도우용 JVM을 설치만 하면 됩니다.
여기서 JVM은 운영체제에 종속적이라는 특징을 알 수 있습니다.
JVM 메모리 구조
JVM의 구조는 크게 보면 Garbage Collecotor, Execution Engine, Class Loader, Runtime Data Area 4가지로 나눌 수 있다.
자바 프로그램의 실행 단계이다.
자바 소스파일은 자바 컴파일러에 의해서 바이트 코드 형태인 클래스 파일이 되고 이 클래스 파일은 클래스 로더가 읽어들이면서 JVM이 수행됩니다.
1. Class Loader
JVM내로 클래스 파일을 로드하고, 링크를 통해 배치하는작업을 수행하는 모듈.
런타임 시에 동적으로 클래스를 로드합니다.
2. Execution Engine
클래스 로더를 통해 JVM내의 Runtime Data Area에 배치된 바이트 코드들을 명령어
단위로 읽어서 실행합니다. 최초 JVM이 나왔을 당시에는 인터프리터 방식이었기 때문에 속도가 느리다는 단점이 있었지만 JIT 컴파일러 방식을 통해 이 점을 보완하였습니다.
이유로 JVM은 모든 코드를 JIT 컴파일러 방식으로 실행하지 않고 , 인터프리터 방식을 사용하다가 일정한 기준이 넘어가면 JIT컴파일러 방식으로 실행합니다.
3. Garbage Collector
Garbage Collector(GC)는 힙 메모리 영역에 생성된 객체들 중에서 참조되지 않은 객체들을 탐색 후 제거하는 역할을 합니다. 이때, GC가 역할을 하는 시간은 언제인지 정확히 알 수 없습니다.
4. Runtime Data Area
JVM의 메모리 영역으로 자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역입니다. 이 영역은 크게 Method Area, Heap Area, Stack Area, PC Register, Native Method Stack로 나눌 수 있습니다.
(1) Method area
- 모든 쓰레드에서 공유하며 JVM이 실행되면서 생기는 공간.
Class 정보, 전역변수 정보, Static 변수 정보가 저장되는 공간.
Runtime Constant Pool에는 말 그대로 ‘상수’정보가 저장되는 공간.
(2) Heap area
- 모든 쓰레드에서 공유하며 new연산자로 생성된 객체, Array와 같은 동적으로 생성된 데이터가 저장되는 공간.
Reference Type의 데이터가 저장되는 공간
Heap에 저장된 데이터는 Garbage Collector가 처리하지 않는 한 소멸되지 않는다.
(3) Stack area
- 스레드마다 하나씩 존재하며 지역변수, 메소드의 매개변수와 같이 잠시 사용되고 필요가 없어지는 데이터가 저장되는 공간
Last In First Out, 나중에 들어온 데이터가 먼저 나간다.
만약, 지역변수이지만 Reference Type일 경우에는 Heap에 저장된 데이터의 주소값을 Stack에 저장해서 사용하게 된다.
4) PC Register
- 스레드가 생성되면서 생기는 공간.
스레드가 어느 명령어를 처리하고 있는지 그 주소를 등록하고 JVM이 실행하고 있는 현재 위치를 저장하는 역할
(5) Native Method Stack
- Java가 아닌 다른 언어(C, C++)로 작성된 네이티브 코드를 위한 메모리 영역
'Java' 카테고리의 다른 글
Java Memory구조 (0) | 2022.04.24 |
---|