JVM : Java Virtual Machine 자바 가상 머신
왜 필요한가 ?
Java 의 원칙은 WORA(Write Once Run Anywhere) 이다. 즉 한번 작성한 코드는 어디서든 실행가능해야한다 .
이것을 가능하도록 해주는것이 바로 JVM이다.
JVM의 역활
자바코드는 자바 컴파일러를 실행하여 JVM이 이해할 수 있는 자바 바이트코드로 변환된다.
바이트코드 : 1바이트로 이루어진 자바 가상머신이 읽을 수 있는 코드
바이너리코드(기계어) : 0과1로 이루어진 CPU가 읽을 수 있는 코드
+ 이렇게 변환된 프로그램은 .class 확장자로 저장된다.
자바 바이트코드를 JVM에서 실행하면 운영체제에 맞게 바이너리코드로 변환하여 하드웨어의 자원을 사용한다.
이 말에 따르면 결국 JVM 은 운영체제에 종속적이 라는 말이 된다.
자바코드는 JVM이 있는 운영체재라면 어디서든 실행가능하다. (WORA)
JVM의 특징
- 스택 기반의 가상 머신: 대표적인 컴퓨터 아키텍처인 인텔 x86 아키텍처나 ARM 아키텍처와 같은 하드웨어가 레지스터 기반으로 동작하는 데 비해 JVM은 스택 기반으로 동작한다.
- 심볼릭 레퍼런스: 기본 자료형(primitive data type)을 제외한 모든 타입(클래스와 인터페이스)을 명시적인 메모리 주소 기반의 레퍼런스가 아니라 심볼릭 레퍼런스를 통해 참조한다.
- 가비지 컬렉션(garbage collection): 클래스 인스턴스는 사용자 코드에 의해 명시적으로 생성되고 가비지 컬렉션에 의해 자동으로 파괴된다.
- 기본 자료형을 명확하게 정의하여 플랫폼 독립성 보장: C/C++ 등의 전통적인 언어는 플랫폼에 따라 int 형의 크기가 변한다. JVM은 기본 자료형을 명확하게 정의하여 호환성을 유지하고 플랫폼 독립성을 보장한다.
- 네트워크 바이트 오더(network byte order): 자바 클래스 파일은 네트워크 바이트 오더를 사용한다. 인텔 x86 아키텍처가 사용하는 리틀 엔디안이나, RISC 계열 아키텍처가 주로 사용하는 빅 엔디안 사이에서 플랫폼 독립성을 유지하려면 고정된 바이트 오더를 유지해야 하므로 네트워크 전송 시에 사용하는 바이트 오더인 네트워크 바이트 오더를 사용한다. 네트워크 바이트 오더는 빅 엔디안이다.
< 네이버 D2 JVM 발췌>
네이버 개발자 블로그에서 설명하는 JVM의 특성은 위와 같다.
ARM 아키텍처 : 물리 레지스터를 이용한 명령처리
스택기반 : 스택구조를 이용한 연산
JVM의 특징으로 스택기반이라는 말이 보통은 레지스터를 이용한 연산을 하지만 JVM에서는 위 이미지와 같이 스택구조로 Pop하여 연산을 처리한다.
심볼릭 레퍼런스 : 기본 자료형을 제외한 모든 타입들이 메모리 구조 레퍼런스가 아니라 , 이름을 참조한다고 한다
# 심볼릭 레퍼런스란?
심볼릭 레퍼런스는 참고하는 클래스의 특정 메모리 주소를 참조 관계로 구성한 것이 아니라 참조하는 대상의 이름만을 지칭한 것이다.
Class 파일이 JVM에 올라가게 되면 심볼릭 레퍼런스는 그 이름에 맞는 객체의 주소를 찾아서 연결하는 작업을 수행한다.
실제 메모리 주소가 아니라 이름만을 가진다.
<출처 : 공부하는개미 님 블로그>
가비지 컬렉션(Garbage Collection) : 클래스 인스턴스는 사용자에 의해 생성되고 , 역활을 끝낸 인스턴스는 가비지 컬렉터로인해 메모리에서 삭제된다.
기본 자료형을 명확하게 정의하여 플랫폼 독립성 보장 :
C , C++ 에서 포인터를 사용할 때 플랫폼에 의존하게 된다.
예를들어 32bit 플랫폼 에서 int *p; 를 선언한다면 해당 메모리는 4바이트의 크기를 가지게된다.
하지만 64bit 플랫폼에서는 해당 메모리는 8바이트의 크기를 가지게된다.
하지만 JVM에서는 항상 4바이트의 크기를 가지게된다.
호스트 바이트 오더 : 어떤 데이터를 표현하는 방법
1. 빅 엔디안 : 상위 바이트값이 메모리에 먼저 표기
2. 리틀 엔디안 : 하위 바이트값이 메모리에 먼저 표기
네트워크 바이트 오더 : 데이터를 전송할 때 방법(빅 엔디안,리틀엔디안)을 통일하자는 약속이다. 네트워크 바이트 오더는 빅 엔디안 방법을 사용하기로 약속 되어있다.
참고 :
'공부 > JAVA' 카테고리의 다른 글
[Java] 클래스 (0) | 2022.09.27 |
---|---|
[JAVA]제어문 (2) | 2022.09.20 |
[Java] 연산자 (0) | 2022.09.14 |
자바 데이터 타입, 변수 그리고 배열 (0) | 2022.09.06 |
좋은객체지향의설계원칙5가지(SOLID) (0) | 2022.02.26 |