Java
JVM, JRE, JDK, 메모리 구조
KimJye
2020. 1. 15. 00:52
JVM
- Java Virtual Machine의 약자. 자바 가상 기계
- 자바 소스코드를 컴파일러가 바이너리 코드로 변환하는데 변환된 파일을 실행할 수 있다.
- 컴파일된 바이너리 코드는 어떤 JVM에서 사용 가능하다
- 바이너리 코드를 읽고 검증한뒤 실행한다
- 실행환경의 규격을 제공한다(필요한 라이브러리 및 기타파일)
JRE
- Java Runtime Environment의 약자. 자바 실행 환경
- JVM의 실행환경을 구현했다
JDK
- Java Development Kit의 약자. 자바 개발 도구
- JRE 실행에 필요한 도구들을 포함
메모리 구조
JVM이 실행되면 OS가 JVM에게 필요한 메모리를 할당한다.
OS로 받은 메모리를 'Runtime Data Area'라고 한다.
JVM은 Runtime Data Area를 용도에 맞게 쓰기위하여 5개 영역으로 쪼개서 관리한다.
- Class Area(Method Area = Static Area)
- Stack Area
- Heap Area
- Native Method Stack Area
- PC Register
메소드 영역 (Class Area, Method Area)
- 클래스 파일의 바이트코드가 여기로 로드가 된다. 이것을 클래스 로딩이라고 한다.
- 클래스파일과 static 변수가 여기에 로드된다.
- 어떤 메소드를 호출하는 문장을 만났는데, 그 메소드를 가진 클래스가 아직 메소드 영역에 로드가 되지 않았다면 곧바로 JVM은 JRE 라이브러리 폴더에서 해당 클래스를 찾는다.
- 없으면 ClassPath 환경변수에 지정된 경로에서 클래스를 찾는다.
- 찾았으면 JVM이 그 클래스 파일이 올바른지 바이트 코드를 검증한다.
- 올바른 바이트코드라면 메소드 영역에 바이트코드를 올린다. (클래스 로딩)
- 이렇게 클래스의 바이트코드가 한번 로딩이되면 JVM이 종료될때까지 유지가 된다.
스택 영역(Stack Area)
- 지역변수와 매개변수가 저장된다.
- 지역변수는 메소드안에 선언된 변수이다.
- 매개변수는 파라미터 변수이다.
- 임시로 할당된다. 끝나면 바로 소멸
- 즉 메소드가 호출될때마다 그 메소드의 지역 변수를 준비하고, 메소드 호출이 끝나면 그 메소드를 위해 준비했던 모든 변수가 스택에서 제거가 된다.
- Heap 영역에 생성된 Object 타입의 데이터 참조값이 들어있다.
- 원시타입의 데이터들은 실제 값이 들어있다.
- 각 쓰레드는 자신만의 stack을 가진다.
힙 영역(Heap Area)
- new 명령을 통해 생성된 인스턴스
- 스택영역과는 달리 메소드 호출이 끝나도 사라지지 않고 유지된다.
- 몇개의 스레드가 존재하든 상관없이 단 하나의 heap 영역만 존재한다.