JVM(Java Virtual Machine)
자바 프로그램 실행환경을 만들어 주는 소프트웨어 이다. 자바 코드를 컴파일하여 .class 바이트 코드로 만들면 이 코드가 자바 가상 머신 환경에서 실행된다.
.class 파일은 바이트 코드 라고 하는데 사람이 쓰는 자바 코드에서 컴퓨터가 읽는 기계어로의 중간 단계 이며 java 언어로 작성된 java 파일은 컴파일 하면 .class 파일이 생성되고 생성된 바이트 코드는 각자의 플랫폼에 설치되어 있는 JVM이 운영체제에 맞는 실행 파일로 바꿔준다
java는 컴파일된 바이트코드로 어떤 jvm에서도 동작이 가능하기에 플랫폼에 의존적이지 않지만 jvm은 플랫폼에 의존적이다 윈도우와 리눅스 jvm은 서로 다름
생성한 .java 파일을 컴파일하면 javac 에 의해 .class 파일이 만들어짐, 이후 클래스 로더를 통해 JVM Runtime Data Area로 로딩되고 로딩된 .class 바이트 코드를 실행할 컴퓨터에 깔린 JVM에 가져다주면 그 컴퓨터가 이 프로그램을 실행할 때 JVM 이 기계어로 해석한다
소스코드(Source Code)
컴파일러(Java Compiler)
자바 소드코드를 컴파일하여 자바 가상 머신이 이해할 수 있는 자바 바이트 코드(.class 파일)로 변환하는 역할을 한다.
JDK를 설치하면 javac.exe라는 실행 파일 형태로 설치된다
클래스 로더(Class Loader)
클래스 로더에는 로딩, 링크 초기화 단계로 나뉘어져 있다.
로딩
자바 바이트 코드(.class)를 메소드 영역에 저장한다.
각 자바 바이트 코드(.class)는 JVM에 의해 메소드 영역에 다음 정보들을 저장한다.
로드된 클래스를 비롯한 그의 부모 클래스의 정보
클래스 파일과 Class, Interface, Enum의 관련 여부
변수나 메소드 등의 정보
링크
검증: 읽어 들인 클래스가 자바 언어 명세 및 JVM 명세에 명시된 대로 잘 구성되어 있는지 검사한다.
준비: 클래스가 필요로 하는 메모리를 할당하고, 클래스에서 정의된 필드, 메소드, 인터페이스를 나타내는 데이터 구조를 준비한다.
분석: 심볼릭 메모리 레퍼런스를 메소드 영역에 있는 실제 레퍼런스로 교체한다.
초기화
클래스 변수들을 적절한 값으로 초기화 한다. 즉, static 필드들이 설정된 값으로 초기화한다.
클래스 로딩 시점
클래스의 인스턴스가 생성될때, 클래스의 정적 변수가 사용될때 (단, 정적 변수는 final로 선언된 상수는 로딩 안됨), 클래스의 정적 메소드가 호출될때, static 내부클래스의 static 변수, 메소드를 호출할 경우 에는 내부 클래스만 로딩됨, 외부 클래스가 로딩 될 때 내부 클래스는 로딩 안됨
초기화 시점
클래스의 인스턴스 생성, 클래스의 정적 변수 사용 (final 키워드 X), 클래스의 정적 메소드 호출
실행 엔진(Execution Engine)
클래스 로더에 의해 JVM으로 로드된 .class 파일(바이트코드)들은 Runtime Data Areas의 Method Area에 배치되는데 배치 이후에 JVM은 Method Area의 바이트 코드를 실행 엔진(Execution Engine)에 제공하여 정의된 내용대로 바이트 코드를 실행시킨다.
이때, 로드된 바이트코드를 실행하는 런타임 모듈이 실행 엔진임 바이트코드를 명령어 단위로 읽어서 실행한다.
가비지 컬렉터(Garbage Collector)
Heap 메모리 영역에 생성(적재)된 객체들 중에 참조되지 않은 객체들을 탐색 후 제거하는 역할을 한다.
런타임 데이터 영역 (Runtime Data Area)
메소드 영역 (Method Area) 또는 클래스 영역(Class area)
힙 영역 (Heap Area)
스택 영역 (Stack Area)
PC 레지스터 (PC Register)
네이티브 메서드 스택 (Native Method Stack)
나의 2번째 블로깅이다😁 이번 기회에 JVM 메모리 구조에 대해서 구글링도 많이 해보고 정리하여 작성하다보니 어느정도 감이 잡히는 시간이 됬다 잊어먹을 때 마다 와서 다시 읽어야지🤣
2022.11.04 21:40 작성