프로그램을 실행시키기 위해서 컴퓨터 메모리에 실행시킬 데이터와 명령어들을 저장해야 한다.
자바 프로그램 역시 운영체제(OS)가 제어하고 있는 메모리(RAM)를 사용 및 할당받을 수 있어야 하는데 JVM(Java Virtual Muchine)이 H/W, OS위에서 동작하며 메모리를 할당받고 자바프로그램을 호출하여 실행한다.
- Java 프로그램 실행 과정
개발자가 만든 .java 파일을 javac 명령으로 컴파일하면 .class 바이트 코드 파일이 만들어진다.
프로그램 실행하면 JVM은 OS로 부터 프로그램이 필요로 하는 메모리를 할당 받는다.
바이트 코드 파일을 Class Loader를 통해 동적으로 클래스를 로드하고 JVM 내로 로딩하여 검증 - 링크 - 초기화 과정을 거치고 Runtime Data Area 중 Method Area(Static Area)에 실행 가능한 상태로 데이터를 메모리에 적재한다. 여기에 배치된 바이트 코드를 다시 Class Loader를 통해 Execution Engine이 명령어 단위로 읽어서 기계가 알아들을 수 있는 바이너리 코드로 변환하여 프로그램을 실행한다.
- Runtime Data area 메모리 영역
Method Area or Static Area or Class Area
모든 스레드가 공유하는 영역으로 JVM이 시작될 때 성성된다.
메서드 영역에는 2가지 영역으로 나뉘는데 code 세그먼트와 data 세그먼트로 나뉘는데
code 세그먼트에는 JVM이 읽어들인 각각의 클래스와 인터페이스에 대한 런타임 상수 풀, 필드와 메서드에 대한 바이트 코드 등을 메모리에 보관한다. 보관만 하는 것일 뿐 실제로 사용하려면 new 객체 생성으로 메서드 영역에 코드들을 읽어서 Heap영역에 인스턴스로 생성되어야 사용할 수 있다.
data 세그먼트는 static 필드와 static 메서드에 사용 가능한 상태로 할당되어 객체생성 없이 사용 가능한 객체들이다. 프로그램이 종료될 때까지 사용할 수 있다.
Stack Area
각각 스레드가 시작될 때 하나씩 생성되어 단일 스레드당 메서드가 호출될 때 메모리를 차지한다. 메서드가 호출되면 메서드와 메서드 정보는 Stack Frame이 생성되어 해당 스레드의 Stack Area에 추가되고 메서드가 종료되면 해당 Stack Frame이 제거된다. 메서드 정보, 지역변수, 매개변수, 연산 중 발생하는 임시데이터를 저장하는 공간이다.
데이터 타입이 primitive type 이면 해당 메모리 공간에 값이 직접 들어가지만 reference type 객체를 new로 생성하게 되면 인스턴스가 Heap 영역에 생성되고 해당 인스턴스 주소값이 저장된다.
Heap Area
클래스 인스턴스와 Array에 대한 메모리를 관리한다. 가비지 컬렉터에 의해 관리되는 메모리 영역이다.
-eden : 인스턴스가 최초 생성되면 할당되는 공간. 이 곳에 인스턴스가 가득차면 가비지 컬렉션이 발생한다.
-Survivor0, 1 : eden 영역에서 가비지 컬렉션이 발생한 후 여전히 참조 객체로 남아있는 인스턴스들이 옮겨오는 공간.
-Old Generation : Yong Generation에서 살아남은 객체들이 저장되는 공간
-Permanenet : 생성된 객체들의 주소값이 저장된 공간. 클래스 로더에 의해 보관된 Class, Method 등에 대한 Meta 정보가 저장된다. (java 8부터 없어짐)
PC Registers
Thread가 생성될 때 마다 생기는 공간으로 현재 Thread가 실행되는 부분의 주소와 어떠한 명령을 실행하게 될지에 대한 부분을 기록을 한다.
JVM은 Stacks-Base 방식으로 작동 하는데, JVM은 CPU에 직접 Instruction을 수행하지 않고, Stack에서 Operand를 뽑아내 이를 별도의 메모리 공간에 저장하는 방식을 취하는데, 이러한 메모리 공간을 PC Registers라고 한다.
Native Method Stacks
자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역.
보통 C/C++ 등의 코드를 수행하기 위한 스택. native 메서드의 매개변수, 지역변수 등을 바이트 코드로 저장
https://12216715011126.tistory.com/60
https://www.holaxprogramming.com/2013/07/16/java-jvm-runtime-data-area/
https://steady-coding.tistory.com/305
https://cafe.naver.com/jjdev/227
https://steady-snail.tistory.com/67
https://coding-factory.tistory.com/828
https://smjeon.dev/categories/#etc
'Effective Java > 키워드' 카테고리의 다른 글
Java의 참조 유형 (0) | 2023.01.30 |
---|---|
가비지 컬렉션 (GC, Garbage Collection) (0) | 2023.01.22 |
팩터리 메서드 패턴 (Factory Method Pattern) (0) | 2023.01.08 |
플라이 웨이트 패턴 (Flyweight Pattern) (0) | 2023.01.07 |
브리지 패턴 (Bridge Pattern) (0) | 2023.01.07 |