Language/Java

JVM 정리하기!

DuL2 2022. 7. 24. 23:19

JVM이란?

 JVM은 Java Virtual Machine의 줄임말로 자바를 실행하기 위해 필요한 가상 머신을 말한다. Java의 특징으로 OS에 종속적이지 않은데 이는 Window든 Mac이든 Linux계열이든 상관없이 각 OS 에 맞는 플랫폼 JVM만 존재한다면 마치 가상 컴퓨터를 사용하듯 java class 파일들을 사용할 수 있는 것이다.

 

 JVM은 OS로부터 우리가 사용하고 싶은 프로그램이 필요로하는 메모리를 할당 받고 자바 파일이 compiler에 의해 자바 바이트 코드로 변환된 다음 클래스 로더를 통해 로딩되어 수행이 이루어지게 된다. 이 와중에 GC(Garbage Collection)같은 메모리 효율을 높이기 위한 작업을 수행하고, 각 해석된 자바 바이트 코드는 런타임 데이터 영역에 배치되게 된다.

 

JVM의 특징

https://www.programiz.com/dsa/stack

  • 스택 기반의 가상머신 
    • VM은 크게 스택 기반과 레지스터 기반으로 나누어진다. 그중 JVM은 스택 기반이다.
    • 피연산자 스택(Operand stack)이란 LIFO 자료 구조를 가지며 명령어에 필요한 매개변수를 저장하는 역할이다.
    • 피연산자를 스택에 저장하고 가져오는 과정을 반복하면서 프로그램이 작동되는 것인데 이는 다음과 같은 장단점을 불러온다.
      • 장점 
        1. 하드웨어에 덜 의존적이게 된다. HW(레지스터, CPU)의 자원을 직접 컨트롤하지 않기 때문에 다양한 하드웨어에서 사용할 수 있게 된다.
        2. 명령어 길이가 짧아진다. 다음 단계에서 계산해야할 피연산자는 스택의 TOP 맨 윗부분에 존재하므로 주소값을 쓸 필요가 없다. 따라서 주소값을 사용하지 않기에 명령어의 길이가 짧아진다.
      • 단점
        1. 명령어 수가 많아진다.
        2. 스택을 사용하는 오버헤드(추가 소요 시간 - 동떨어진 코드를 사용할 일이 존재하기 때문. )가 존재한다.
        3. 명령어 최적화를 할 수 없다.
      • 실제 효율로서는 스택기반의 VM은 효율이 떨어진다.(레지스터 기반과 벤치를 돌리면 레지스터 VM은 32.3% 시간이 절약된다고 함.) 이유는 직접 CPU에 자원을 요청하지 않기 때문이다. 하지만, 그럼에도 사용되는 이유는 다양한 OS에서 개발을 하고 사용할 수 있다는 강점이 있기 때문이다.
  • 심볼릭 레퍼런스(symbolic references)
    • 참고하는 클래스의 특정 메모리 주소를 참조 관계로 구성한 것이 아닌 참조하는 대상의 이름만을 지칭한 것.
    • 클래스 로더에서 분석 동작시 상수 풀 내의 모든 레퍼런스를 다이렉트 레퍼런스로 변경하면서 사용하게 된다.

garbage collector 구글링 이미지 ㅋㅋ

  • 가비지 컬렉션(garbage collection)
    •  자바 이전에는 모든 프로그램 메모리가 프로그래머에 의해 관리되었다고 한다. 하지만, 하지만 자바에서는 이를 JVM이 관리를 한다. 이 과정을 `가비지 컬렉션(garbage collection)` 이라고 하며 사용하지 않는 메모리를 자바 프로그램 내에서 식별하고 없애게 된다.
    • 초창기에는 Java가 C++ 만큼 빠르지 않아("close to the metal") 비판이 많았었는데 다양한 알고리즘이 제안되면서 GC가 엄청난 발전이 있었다고 한다.
    • 위에서 다룬 이야기처럼 레지스터 기반보다 효율이 떨어지는 것을 조롱했던 것 같습니다. 현재는 고도로 정제된 기술로 인해 오류가 줄어들고 더 좋은 성능을 이끌어 내고 있는 것 같습니다.
  • 기본 자료형을 명확하게 정의하여 플랫폼 독립성 보장
    • 이 말은 C/C++등의 전통적인 언어는 플랫폼에 따라 int형의 크기가 변하지만 JVM은 어떤 OS를 사용하던지 이를 명확하게 정의하여 호황성을 유지하고 플랫폼 자체의 독립성을 보장한다는 이야기입니다.

 

정리

 오늘은 간단하게 개발 첫시작 때 공부했었던 JVM을 정리해보았지만 아직도 JIT 텀파일러, JVM의 구성요소 등 공부해야하는 영역들이 많은 듯 하다.

 

 Heap과 GC에 대한 이야기를 하다보니 일전에 우테코 유튜브에서 어떻게 Heap을 정리하고 GC가 작동하는 지에 대한 영상을 봤었는데 재밌게 봤던 기억이 있어 링크를 남기려 한다. 이 영상말고도 비교적 최근 추가된 조엘님의 GC도 한번 보면 좋을 것 같다.

 

 

 

읽은 글

'Language > Java' 카테고리의 다른 글

[JAVA] Map.Entry  (0) 2023.04.21
[JAVA] 스트림(Stream) - 가공  (0) 2023.03.10
[JAVA] 스트림(Stream)  (0) 2023.03.03
[Java] Static, Heap, Stack  (0) 2022.10.18
JAVA - Enum 파헤치기  (0) 2022.07.26