(Java) Java JVM & DVM & ART 개념 및 차이점

JVM

자바 바이트 코드를 실행할 수 있는 주체로 OS 운영체제 위에서 작동을 한다 → 플랫폼 독립적 (C++은 실행파일까지 만들어버리기에 OS마다 새로 빌드) preview

JVM 구조 preview

  1. 클래스 로더
    1. 로딩 - boost strap, extension, application
    2. 링크 - verify, prepare, resolve
    3. 초기화 - 모든 정적 변수 원래 값으로 지정되고 정적 블록 실행?
  2. 실행엔진
    1. 인터프리터 - 바이트 코드를 한 행식 읽어서 실행
    2. JIT 컴파일러
      1. 빌드 - 소스코드를 중간언어인 바이트 코드로 변경
      2. 런타임 - 중간언어(바이트코드)를 기계어로 변환. 변환 시간이 오래 걸리기에 인터프리터로 해석하고 실행
    3. GC(Garbar Collector - 참지되지 않는 오브젝트를 수집/제거
  3. 메모리(Run Time Data)
    1. PC Register
      1. 수행 명령어의 실행 주소를 가짐
    2. Native Method Stack
      1. Native method 정보 보유
      2. Java외의 언어로 작성된 네이티브 코드들을 위한 stack으로 JNI(Java Native Interface), C/C++코드를 수행하기 위한 stack
    3. Heap Area
      1. 모든 객체, 인스턴스 변수, 배열이 저장되는 곳
      2. 여러 쓰레드에 대한 메모리를 공유하나 스레드 안전하지 않음
    4. Stack Area
      1. 모든 쓰레드에 대해 별도의 런타임 스택이 만들어짐. 각각은 스택 프레임이라고 하는 스택 메모리 존재하고 3가지 하위 항목이 있음
        1. Local - 지역 변수
        2. Operand - 수행 도중 중간 작업 필요한 경우
        3. Frame - 메소드에 해당하는 모든 심볼
    5. Method Area
      1. 클래스 수준의 데이터가 정적 변수를 포함하여 저장
      2. 공유 자원…?

preview

DVM

안드로이드 운영체제는 PC와 달리 메모리/실행 등의 제약이 많으므로 바이트코드를 그대로 사용이 불가능했다. 바이트 코드를 묶은 .dex파일을 만들고 이에 resourse를 더해 .apk파일을 만든다. preview 안드로이드에서 JVM으로 컴파일된 바이트코드를 실행할 수 없다. java byteCode → dalvik byteCode로 변환하는 dx툴을 android SDk에 포함시켜 두었다.여러 클래스 파일을 묶어서 .dex로 변환하면서 dalvik byte code 로 바꾼다. 압축이 일어나기에 .jar 파일 보다는 크기가 조금 줄어든다.

JIT 컴파일

Trace-JIT(인터프리터)? Threshold를 초과하면 바이트코드를 기계어로 해석. 특정 횟수 이상 반복되면 컴파일

Intepreter(인터프리터)? 한 줄씩 실행

JVM이 아닌 DVM 일까?

ART

ART 주요기능

DVM vs ART

preview DVM으로 실행을 하면 코드를 Trace JIT 방식으로 기계어로 읽는 반면에 AOT는 미리 사전 컴파일을 진행하고 ART를 통해 바로 실행하는 차이가 있다.

dexopt vs dex2oat 내부적으로 살펴보면 dex파일을 내부적으로 처리하는 방식이 다르다.

결론



Related Posts