공부/JAVA

[JAVA] JVM 이란 무엇이며 자바코드는 어떻게 실행되는가

Dr.thousand 2022. 8. 30. 15:44
728x90

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 아키텍처 : 물리 레지스터를 이용한 명령처리

스택기반 : 스택구조를 이용한 연산

&amp;amp;lt; Ellie 님 블로그에서 발췌 &amp;amp;gt;

JVM의 특징으로 스택기반이라는 말이 보통은 레지스터를 이용한 연산을 하지만 JVM에서는 위 이미지와 같이 스택구조로 Pop하여 연산을 처리한다.


심볼릭 레퍼런스 : 기본 자료형을 제외한 모든 타입들이 메모리 구조 레퍼런스가 아니라 , 이름을 참조한다고 한다

# 심볼릭 레퍼런스란?

심볼릭 레퍼런스는 참고하는 클래스의 특정 메모리 주소를 참조 관계로 구성한 것이 아니라 참조하는 대상의 이름만을 지칭한 것이다.

Class 파일이 JVM에 올라가게 되면 심볼릭 레퍼런스는 그 이름에 맞는 객체의 주소를 찾아서 연결하는 작업을 수행한다.

실제 메모리 주소가 아니라 이름만을 가진다.

<출처 : 공부하는개미 님 블로그>


 

가비지 컬렉션(Garbage Collection) :  클래스 인스턴스는 사용자에 의해 생성되고 , 역활을 끝낸 인스턴스는 가비지 컬렉터로인해 메모리에서 삭제된다.


기본 자료형을 명확하게 정의하여 플랫폼 독립성 보장 : 

C , C++ 에서 포인터를 사용할 때 플랫폼에 의존하게 된다.

예를들어 32bit 플랫폼 에서 int *p;  를 선언한다면 해당 메모리는 4바이트의 크기를 가지게된다.

하지만 64bit 플랫폼에서는 해당 메모리는 8바이트의 크기를 가지게된다. 

하지만 JVM에서는 항상 4바이트의 크기를 가지게된다.


호스트 바이트 오더 : 어떤 데이터를 표현하는 방법

1. 빅 엔디안 : 상위 바이트값이 메모리에 먼저 표기

2. 리틀 엔디안 : 하위 바이트값이 메모리에 먼저 표기

 

네트워크 바이트 오더 : 데이터를 전송할 때 방법(빅 엔디안,리틀엔디안)을 통일하자는 약속이다. 네트워크 바이트 오더는 빅 엔디안 방법을 사용하기로 약속 되어있다.

 


참고 : 

https://d2.naver.com/helloworld/1230

728x90
반응형

'공부 > 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