TIL

Chapter 2. JVM 이야기

성능에 관심 있는 개발자라면 기본적인 JVM 기술 스택 구조를 이해해야 한다.

2.1 인터프리팅과 클래스로딩

인터프리팅

클래스 로딩

2.2 바이트코드 실행

자바 언어와 JVM은 어느 정도 독립적이다. JVM 규격에 따라 컴파일되는 JVM 언어는 모두 다 실행 된다. (ex. 스칼라)

클래스 파일 해부도

JVM은 클래스를 로드할 때 올바른 형식을 준수하고 있는지 빠짐 없이 검사한다.

2.3 핫스팟 입문

1999년 4월 핫스팟 가상 머신 도입 이후 자바는 C/C++ 같은 언어에 필적하는 성능을 자랑하며 진화를 거듭했다.

image

2.3.1 JIT 컴파일이란?

전통적인 입장에서 컴퓨터 프로그램을 만드는 방법은 두 가지가 있는데, 인터프리트 방식과 정적 컴파일 방식으로 나눌 수 있다. 이 중 인터프리트 방식은 실행 중 프로그래밍 언어를 읽어가면서 해당 기능에 대응하는 기계어 코드를 실행하며, 반면 정적 컴파일은 실행하기 전에 프로그램 코드를 기계어로 번역한다.

JIT 컴파일러는 두 가지의 방식을 혼합한 방식. 실행 시점에서 인터프리트 방식으로 기계어 코드를 생성하면서 그 코드를 캐싱하여, 같은 함수가 여러 번 불릴 때 매번 기계어 코드를 생성하는 것을 방지한다.

즉, 자바 컴파일러가 자바 프로그램 코드를 바이트코드로 변환한 다음, 실제 바이트코드를 실행하는 시점에서 자바 가상 머신이 바이트코드를 JIT 컴파일을 통해 기계어로 변환한다. 참고 - 위키백과

2.4 JVM 메모리 관리

핫스팟의 컴파일 시스템과 더불어 자바를 독보적인 언어로 만들었던 특징은 자동 메모리 관리 기능이다.

2.5 스레딩과 자바 메모리 모델 (JMM)

2.6 JVM 구현체 종류

2.6.1 JVM 라이선스

2.7 JVM 모니터링과 툴링

JVM은 애플리케이션을 인스트루먼테이션, 모니터링, 관측하는 다양한 기술을 제공

인스트루먼테이션(instrumentation): 오류 진단이나 성능 개선을 위해 애플리케이션에 특정한 코드를 끼워 넣는 것

Java Management Extensions (JMX)

Java agent

JVM Toll Interface (JVMTI)

Serviceability Agent (SA)

2.7.1 VisualVM