-
시작하며
JVM은 Java Virtual Machine의 약자로 자바를 실행하기 위한 가상 기계라는 의미입니다.
이는 코드가 플랫폼에 의존하지 않게 하기 위해 제작되었고,자바 바이트 코드를 타겟 플랫폼과 상관 없이 JVM 위에서 동작시킬 수 있게 합니다.
( 물론 타겟 플랫폼에 JVM이 설치가 되어 있어야 합니다. )
"Wirte Once, Run Anywhere" - Sun Mycrosystems
하지만 이런 의문이 존재할 수 있습니다.
"크로스 컴파일이 있는데 굳이 JVM?"
하지만 자바의 주 목적은 코드가 플랫폼에 의존하지 않게 하기 위함이었습니다.
( 휴대폰, PMP 등과 같이 네트워크에 연결된 모든 디바이스에서 작동시키는 것 )
JVM 이전 C와 C++은 컴파일 플랫폼과 타겟 플랫폼이 다를 경우 프로그램이 동작하지 않았으며, 그에 대한 해결 방안으로 C와 C++은 타겟 플랫폼에 맞춰 컴파일 하는 방식인 "크로스 컴파일" 이라는 방법을 사용했습니다. [ ex. Linux에서 컴파일한 파일을 Window에서 작동시 오류 발생 ]
JVM의 구조
- Class Loader
▶ JVM 내로 클래스 파일을 로드하고, 링크를 통해 배치하는 작업 수행
▶ 런타임 시에 동적으로 클래스를 로드한다. - Execution Engine
▶ 클래스 로더를 통해 JVM 내의 Runtime Data Area에 배치된 바이트 코드들을 명렁어 단위로 읽어서 실행
( 인터프리터 방식과 JIT 방식 사용 ) - Garbage Collector
▶ 힙 메모리 영역에 생성된 객체들 중에서 참조되지 않은 객체들을 탐색 후 제거
JAVA 컴파일 과정
1. JAVA 컴파일러를 통해 자바 코드는 바이트 코드로 변환됩니다.
2. 이후 변환된 코드는 JVM의 Class Loader로 전달되고
3. 동적 로딩을 통해 필요한 클래스들을 JVM 메모리에 할당합니다.
4. 이를 실행 엔진(Execution Engine)이 읽어 실행하게 됩니다.JVM의 메모리 영역 ( Runtime Data Area )
- Method Area
▶ JVM 시작 시 생성되는 공간
▶ 클래스 로더가 클래스 파일을 읽어오면 정보를 파싱해 Method Area에 저장
▶ 클래스, 인터페이스, 메소드, 필드, Static 변수 등의 바이트 코드를 보관
▶ 모든 쓰레드가 공유 - Heap Area
▶ 동적 메모리가 저장되는 영역
▶ 전역변수와 동적 생성 객체, 배열이 저장 되는 공간
▶ 모든 쓰레드가 공유
▶ 불필요한 메모리들은 GC에서 관리 - Stack Area
▶ 정적 메모리가 저장되는 영역
▶ 지역변수, 매개변수, 메소드 정보, 힙 영역에서 생성된 Object 타입의 참조 값 등이 저장
▶ LIFO 방식으로 관리
▶ 쓰레드별 1개씩 존재 - PC Register
▶ 각 쓰레드는 메소드를 실행하고 있으며, pc는 그 메소드 안에서 몇 번째 줄을
실행해야 하는지 나타내는 역할
▶ 현재 수행중 JVM 명령어 주소를 갖는다.
▶ 쓰레드별 1개씩 존재 - Native Method Stack
▶ 자바 외 언어의 정보가 담겨진 공간
▶ 성능 향상을 위한 목적
Q. 왜 피연산자를 저장하는데 레지스터를 쓰지 않고 스택을 사용할까?
A. 디바이스마다 레지스터가 다르다. 스택을 쓴다면 계산 과정은 복잡해 질 수 있으나
하드웨어의 스펙에 최소 관여하게 된다. 이러한 장점은 JVM의 모토와 일치하다Garbage Collector
GC는 JVM의 Heap 영역에서 동적으로 할당했던 메모리 영역 중 필요 없게 된 메모리를 주기적으로 삭제하는 프로세스를 말합니다. 이는 순회를 통해 메모리가 어떤 객체를 참조하고 있는지 마킹하고 참조하고 있지 않은 메모리들을 제거 후 분산된 메모리를 Heap의 시작 주소로 모아 정리하는 Mark And Sweep 알고리즘을 사용하고 있습니다.
'Study' 카테고리의 다른 글
Redis :: 테스트 환경 구축 (0) 2022.11.22 Redis :: 통계 데이터 배치처리 (0) 2022.11.22 Redis :: 다수의 명령어 파이프 라인으로 처리하기 (0) 2022.11.22 Redis :: 랭킹보드 구현하기 (0) 2022.11.22 스프링 기본 정보 (0) 2022.10.10 - Class Loader