Java코드가 실행되는 과정 설명
JVM 구조 정리
Java코드가 실행되는 과정
Java언어로 프로그래밍 된 파일을 Java 컴파일러가 가상 기계어 파일인 class 파일로 만든다(소스 코드를 Java 바이트 ㅋ토드로 번역한다.). 이후 Java 바이트 코드를 JVM이 읽고 실행.
- JAVA 바이트 코드 : JVM이 이해할 수 있는 언어로 변환된 자바 소스 코드. 자바 컴파일러에 의해 변환되는 코드의 명령어 크기가 1바이트라서 자바 바이트 코드라고 부른다. 확장자는 .class이며 JVM만 설치되어 있으면 어떤 운영체제라도 실행될 수 있다.
- JAVA 컴파일러 : JAVA source파일을 JVM이 해석할 수 있는 JAVA Bytecode(.class파일)로 변경한다.
- Class Loader : JVM 내로 .class파일들을 로드한다. 로딩된 클래스들은 Runtime Data Area에 배치.
- Excution Engine : 로딩된 클래스의 바이트코드를 해석한다. 이 과정에서 Byte code->Binary code로 변경. 윈도우의 경우 Assembler가 Assembly언어로 쓰여진 코드파일을 Binarycode로 변경.
- Runtime Data Area: JVM이 프로세스로서 수행되기 위해 OS에서 할당받는 메모리 영역.
JVM 구조 정리
-Method
:클래스 정보, stayic변수 정보, 상수 정보 등 저장 / 모든 Thread에게 공유
-Heap
:모든 Thread에게 공유 / new 명령어로 생성된 인스턴스 객체가 저장됨-> 공간 부족시 Garbage Collection
-Stack
: 각 Thread마다 하나씩 생성. / Method 안에서 사용되는 값들이 저장되는 구역 /
-PC Register
: 각 Thread마다 하나씩 생성. / Register과 역할 비슷 / 현재 수행 중인 JVM명령의 주소값이 저장
-Native Method Stack
: 각 Thread마다 하나씩 생성. / 다른 언어의 메소드 호출을 위해 할당되는 언어에 맞게 Stack이 형성되는 구역
Garbage Collection
: 프로그램을 개발할때 유효하지 않은 메모리(Garbage)가 발생. JVM의 가비지 컬렉터가 불필요한 메모리를 알아서 정리해줌. 단, 명시적으로 불필요한 데이터를 표현하기 위해 일반적으로 null을 선언해준다.
- JVM의 Heap영역은 2가지를 전제로 설계(대부분의 객체는 금방 접근 불가능한 상태가 됨 / 오래된 객체에서 새로운 개체로의 참조는 아주 적게 존재)
-->객체는 대부분 일회성이며, 메모리에 오래 남아있는 경우가 드물다. 때문에 객체의 생존 기간에 따라 물리적인 Heap영역을 나누고 Young/ Old영역으로 설계. Perm 영역이 있었지만 Java8부터 제거.
- Young영역(Young Generation)
: 새롭게 생성된 객체가 할당(Allocation)되는 영역, 대부분의 객체는 금방 접근 불가능 상태가 되기 때문에 많은 객체가 Young 영역에 생성되었다가 사라짐
- Old(Old Generation)
:Young영역에서 접근 불가능한 상태를 유지하여 살아남은 객체가 복사되는 영역, Young영역보다 크게 할당(영역이 큰 만큼 gabage는 적게 발생), Old영역에 대한 가비지 컬렉션을 Major GC 또는 Full GC라고 함
'스파르타 부트캠프(spring)' 카테고리의 다른 글
자바 심화 강의 정리(OSI 7계층)_221202 (0) | 2022.12.04 |
---|---|
자바 심화 강의 정리(Interface, Stream, Optional)_221201 (0) | 2022.12.01 |
[내일배움캠프_spring] 4주차_미니프로젝트2(4일차) (0) | 2022.11.30 |
[내일배움캠프_spring] 4주차_미니프로젝트2(3일차) (0) | 2022.11.28 |
[내일배움캠프_spring] 주간회고 WIL - 3주차 (0) | 2022.11.28 |