728x90

매번 까먹는 것 같아서 생각난김에 정리해두려고 한다.


JVM 이란?

  • Java Virtual Machine 자바 가상 머신의 약자
  • Class 파일(자바 바이트 코드)을 OS에 특화된 코드로 변환하여 실행
    (OS 환경에 구애받지 않고 재사용 가능하도록 중개 역할)
  • GC(Garbage Collection)를 통해 메모리 관리
  • JAVA는 컴파일러 언어인데 JVM을 통해 인터프리터 방식으로 동작

JVM 기반 언어

  • Java, 클로저, 그루비, JRuby, Jython, Kotlin, Scala 등등..

JVM 구조

JVM 구조 - <출처 : 더 자바, 코드를 조작하는 다양한 방법 - 백기선>


JVM 실행 순서

  1. OS로 부터 메모리를 할당 받음
  2. JAVA 컴파일러(javac)를 통해 JAVA 파일을 Class 파일(바이트 코드)로 변환
  3. 클래스 로더 시스템을 통해 바이트 코드를 읽음
    • 로딩: Class 파일을 읽어오는 과정
    • 링크: 레퍼런스를 연결하는 과정
    • 초기화: static 값들 초기화 및 변수에 할당
  4. 메모리에 배치
    • 메소드: 클래스 수준의 정보(클래스 이름, 부모 클래스 이름, 메소드, 변수) 저장하는 영역
      (공유 자원)
    • 힙: 객체를 저장하는 영역
      (공유 자원)
    • 스택: 쓰레드마다 런타임 스택을 생성. 그 안에 스택 프레임(메소드 호출) 블럭을 쌓음. 쓰레드 종료 시 스택도 사라짐
      (쓰레드 자원)
    • PC(Program Counter) 레지스터: 쓰레드 마다 쓰레드 내 현재 실행할 스택 프레임을 가르키는 포인트 생성
      (쓰레드 자원)
    • 네이티브 메소드 스택
      • JNI(Java Native Interface)
        • 자바 애플리케이션에서 C, C++, 어셈블리로 작성된 함수를 사용할 수 있는 방법 제공
        • Native 키워드를 사용한 메소드 호출
          • 네이티브 메소드 라이브러리: C, C++로 작성 된 라이브러리
            ex) Thread.currentTread();
  5. 실행엔진을 통해 실행 및 관리
    • 인터프리터: 바이트 코드를 한줄 씩 실행
    • JIT 컴파일러: 인터프리터가 JIT 컴파일러로 반복되는 코드 발견 시 네이티브 코드로 바꿈. 인터프리터는 네이티브 코드로 컴파일된 코드를 바로 사용 (인터프리터 효율 증가)
    • GC(Garbage Collector): 더이상 참조되지 않는 객체를 모아서 정리
728x90

'개발 지식 > JAVA 기본 지식' 카테고리의 다른 글

JavaBeans  (0) 2022.01.25
POJO(Plain Old Java Object)  (0) 2022.01.24
OOP(Object Oriented Programming 객체 프로그래밍) 정리  (0) 2022.01.24
클래스 로더 (Class Loader)  (0) 2022.01.22
복사했습니다!