자바 프로그램 실행 과정
- 1.자바 소스코드를 컴파일러가 JVM이 이해할 수 있는 코드(byte code)로 변환
- 2.바이트 코드를 JVM의 클래스 로더에게 전달
- 3.클래스 로더는 동적로딩(Dynamic loading)을 통해 필요한 클래스들을 로딩 및, 링크하여 런타임 데이터 영역(JVM의 메모리)에 올린다.
- 클래스 로더 세부 동작
- 로드 : 클래스 파일을 가져와서 JVM의 메모리에 로드
- 검증 : 자바 언어 명세 및 JVM 몇세에 명시된 대로 구성되어 있는지 검사
- 준비 : 클래스가 필요로 하는 메모리를 할당
- 분석 : 클래스의 상수 풀 내 모든 심볼릭 레퍼런스를 다이렉트 래퍼런스로 변경
- 초기화 : 클래스 변수들을 적절한 값으로 초기화한다. (static 필드)
- 클래스 로더 세부 동작
- 4.실행엔진(Execution engine)은 JVM 메모리에 올라온 바이트 코드들을 명령어 단위로 하나씩 가져와서 실행한다.
- 자바 인터프리터 : 바이트 코드 명령어를 한줄씩 해석하고 실행
- JIT 컴파일러 : 바이트 코드 전체를 컴파일하고 바이너리코드로 변경해서 직접 실행하는 방식
- 5. 해석된 바이트 코드는 메모리 영역에 배치되어 실질적 수행이 이루어진다. JVM은 필요에 따라 스레드 동기화나 가비지 컬렉션같은 메모리 관리 작업을 수행한다.
자바 컴파일러(Java compiler)
- 자바를 가지고 작성한 자바 소스 코드를 자바 가상 머신이 이해할 수 있는 자바 바이트 코드로 변환한다.
- javac.exe
자바 바이트 코드(Java bytecode)
- 자바 가상 머신이 이해할 수 있는 언어로 변환된 자바 소스 코드
- 명령어 크기 1 byte
자바 가상 머신(JVM)
- 자바 바이트 코드를 실행하기 위한 가상 기계
- 각 운영체제에 맞는 JVM을 설치해야 한다.
자바 가상 머신 구성요소
- 자바 인터프리터 : 자바 컴파일러에 의해 변환된 자바 바이트 코드를 읽고 해석하는 역할
- 클래스 로더(class loader)
- 자바는 동적으로 클래스를 읽어오기 때문에, 동적으로 클래스를 로딩해주는 역할
- JIT 컴파일러(Just In Time Compiler)
- 프로그램이 실행 중인 런타임에 실제 기계어로 변환해 주는 컴파일러
- 동적 번역을 통해, 프로그램의 실행 속도를 향상시켜 준다.
- JIT 컴파일러는 자바 컴파일러가 생성한 바이트 코드를 바로 런타임에 기계어로 변환
- 가비지 컬렉터(Garbage Collector)
- 더 이상 사용하지 않는 메모리를 자동으로 회수
- 개발자가 메모리 관리를 하지 않아도 되는 편의성
- 실행 순서 : 참조되지 않은 객체들 탐색 후 삭제 -> 삭제된 객체의 메모리 반환 -> 힙 메모리 재사용
JVM이 관리하는 메모리 구조
- 자바가 실행되면, JVM은 운영체제로 부터 해당 프로그램을 수행할 수 있도록 필요한 메모리를 할당 받는다.
- 용도에 따라
- 1. 메소드(method) 영역
- 클래스에 대한 정보와 함께 클래스 변수(static variable)가 저장되는 영역
- 2. 힙(heap) 영역
- 모든 인스턴스 변수가 저장되는 영역
- new 키워드를 사용한 인스턴스가 생성되면, 해당 인스턴스의 정보를 힙 영역에 저장한다.
- 힙 영역은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당된다.
- 3. 스택(stack) 영역
- 메소드가 호출될 때 메소드의 스택 프레임이 저장되는 영역
- 스택 프레임(stack frame) : 메소드의 호출 정보
- 메소드가 호출되면, 메소드 호출과 관계되는 지역변수와 매개변수를 스택에 저장
- 메소드가 호출되면 함께 할당되고, 호출이 완료되면 소멸한다.
- 메소드가 호출될 때 메소드의 스택 프레임이 저장되는 영역
- 1. 메소드(method) 영역
JVM - Runtime Data Areas
- JVM이 운영체제 위에서 실행되면서 할당받는 메모리 영역
1. PC 레지스터(register)
- 프로그램 실행 포인터를 관리하는 영역
2. Native method stack(네이티브 메서드 스택)
- 실제 실행할 수 있는 기계어로 작성된 프로그램을 실행시키는 영역
3. Method area
- Class 자체에 대한 정보
- Class를 처음 사용하는 시점에 memory에 올라간다.
- class의 static field
4. heap Area
- new keyword으로 생성되는 모든 인스턴스가 저장된다.
- String constant pool : string pool을 heap 안에 가지고 있고, 여기에서 문자열을 관리한다.
5. call stack area
- method가 호출되면 method를 위한 공간이 스택에 쌓인다.
- 그리고 메소드 안에 사용하는 local variable(지역 변수) 같은 것들이 이 공간에 위치한다.
'프로그래밍 > JAVA' 카테고리의 다른 글
[Java] 형변환(Casting), static(클래스 변수, 메소드), this (0) | 2022.10.03 |
---|---|
[Java] 상수(constant), final, String 생성방식(StringBuffer, StringBuilder) (1) | 2022.10.03 |
[Java] 자바 - call by value & reference, 자바 특징, Java 8, primitive &reference type (1) | 2022.10.03 |
[Java] 접근 제어자, 래퍼 클래스, 제너릭, 컬렉션, 스트림, 람다식, Optional (0) | 2022.10.02 |
[Java] JDBC(Java Database Connectivity), Connection pool (0) | 2022.07.21 |