ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [23.12.19] JVM: 아키텍처 및 성능 최적화
    블로그 번역 2023. 12. 19. 10:09
    반응형

    소개글

    JVM은 코드와 실행 성능에 중요한 요소이면서 복잡하게 동작한다.

    JVM을 아는 것은 코드를 구성할 때 성능을 고민하며 작성할 수 있게 도움을 준다.

     

    JVM Architecture

     

    1. Class Loader Subsystem

     

    동적 로딩, 링킹, 클래스 초기화를 하는 시스템이다.

    * 동적 로딩: 클래스 로더는 바이너리 형식으로 데이터를 일고 런타임 영역으로 클래스를 가져오는 역할.

    * 링킹: 로딩 후 로드 클래스가 정확한지, 클래스의 요소에 대해 메모리 할당 및 고정 값 초기화하는 역할.

     

    Class Loader의 종류

    * Bootstrap Class Loader: 자바 Core Class 로드(ex> java.lang.Object)

    * Extension Class Loader: JRE에 있는 클래스를 로드(Core Class와 연결)

    * System/Application Class Loader: 작성 APP의 클래스를 로드

     

    2. Runtime Data Area

    1. 메서드 영역: 모든 스레드가 공유할 수 있는 리소스 저장. 동적 클래스 로더 영역 포함. 메모리 사용량을 줄일 수 있음.

    예시> 상수 풀, Static 변수들

     

    2. 힙 영역: 모든 스레드가 공유할 수 있는 리소스 저장. VM 시작 시  인스턴스 및 배열을 저장. 런타임에 동적으로 힙 사이즈를 재조정 가능.

    개발자는 힙 메모리 모니터링 및 사이즈 Setting이 필수.

     

    3. 스택 영역: 각 스레드가 공유할 수 있는 리소스 저장. 생명주기는 메서드 호출 및 종료.

     

    4. PC 레지스터 영역: JVM에 저장된 리소스의 주소값들을 저장.

     

    5. 네이티브 메서드 스택 영역: 모든 네이티브 메서드 저장. JNI를 가짐. 다른 언어로 작성된 라이브러리를 사용할 때 필요.

    예시> C or C++로 만들어진 메서드

     

    3. Execute Engine

    1. Interpreter: 바이트 스트림을 읽고 순서대로 실행. 그러나 조금 느리고 성능에 영향을 줌.

    2. JIT Compiler: 성능 향상을 위해 사용. 바이트 코드들을 기계어로 번역하여 CPU가 실행할 수 있도록 변환. 인터프리트 된 바이트코드보다 성능이 우수.

    3. Garbage Collectror: 백그라운드에서 실행되며 미사용 클래스 및 메모리 해제를 도와줌.

     

    4. JIT Compiler Optimization Techniques

    JIT 컴파일러의 최적화를 통해 성능을 올리는 방법을 알아보자.

    1. 메서드 인라인

    2. 미사용 코드 제거

    3. 루프 최적화

     

    5. JVM Performance Optimization

    1. 올바른 Garbage Collector 선택

    Serial GC: 싱글 스레드의 작은 어플리케이션에 적합.

    Parallel GC: 멀티 스레드에 적합하며 어플리케이션 처리량을 극대화에 초점이 맞춰짐.

    CMS GC: 짧은 주기의 GC를 실행. 대화형 어플리케이션에 적합.

    G1 GC: 높은 처리량과 STW 최소화가 목표. 사이즈가 큰 힙 사이즈에 적합. 

    Z GC: G1 GC와 동일.

     

    2. Garbage Collector Tunninng

     힙 사이즈 설정: 너무 작은 사이즈는 빈번한 GC, 너무 큰 사이즈는 STW 시간이 너무 김.

    Collector Parameter 설정.

     

    3. 메모리 할당 전략

    Object Pooling: 재사용 객체들은 Pool에 저장하고 사용하는게 효율적.

    효율적 데이터 구조.

     

    6. JVM Monitoring

    중요하게 봐야하는 요소

    Memory Usage

    CPU 활용

    런타임 동작

    스레드 활용

     

    툴 종류

    VisualVM: JDK Command와 경량 프로파일링 기능을 통합해 실시간 모니터링 및 사후 분석을 하기 좋음.

    JConsole: JDK Kit의 일부로 JVM 메트릭을 그래프로 표현. 메모리 사용량과 GC를 확인하기 좋음.

    Java Mission Control: 자세하게 문제에 관해 관찰이 필요할 때 좋음. 

     

     

    참고:https://medium.com/@AlexanderObregon/java-virtual-machine-jvm-deep-dive-into-its-architecture-and-performance-9f8f209b30e7

    반응형

    댓글

Designed by Tistory.