[F-Lab 모각코 챌린지] 3일차 - System, JIT 최적화 방법들

[F-Lab 모각코 챌린지] 3일차 - System, JIT 최적화 방법들 java.lang 의 system 키워드와 jit 가 프로그램을 최적화 하는 방법들을 학습하여 기록 한 글 입니다.

System

Property: 속성 (Thread safe)

  • Hashtable 을 상속받은 클래스로 연관 배열 이다.
  • setProperty 메서드와 remove 메서드는 동기화된다. 여러 스레드에서 동시에 접근하여 속성을 수정하거나 조회 할 때 안전한 동작을 보장함

Environment: 환경

  • 읽기만 가능하다
  • 운영체제 또는 실행 환경에서 설정 된 변수

GC 수행

💡 사용하면 안되는 메서드

실행하면 안되는 이유?

  • JVM 의 구현에 따라 바로 실행되지 않을 수 있다.
  • JVM 이 알아서 GC 를 수행 하는데, 직접 호출하면 필요 이상의 GC 가 동작 할 수 있다.

System.gc()

가비지 컬렉터를 실행함

runFinalization()

GC 처리를 기다리는 모든 객체에 대해 finalize() 메서드 수행

JVM 종료

exit(int status) : 현재 수행중인 JVM 을 멈춘다

  • 종료 코드 이후의 코드는 실행되지 않는다.
  • 프로그램을 강제 종료 시키기 때문에, 리소스 정리는 사전에 수행 해야 한다.

유용한 함수

System.arrayCopy(Object src, int srcPos, Object dest, int destPos, int length)

특정 배열을 복사할 때 사용

  • Object src: 복사 원본 배열
  • Object dest: 복사한 값이 들어가는 배열
  • int srcPos: 원본 시작 위치
  • int destPos: 복사본 시작 위치
  • int length: 복사하는 개수

out.Println

  • println 함수는 object.toString() 을 호출하는 것이 아니라 String.valueOf() 함수의 수행 결과를 출력한다.

JIT - 최적화 방법들

JIT?

  • 런타임 시 바이트 코드를 원시 시스템 코드로 컴파일 하여 Java 애플리케이션의 성능을 향상시키는 런타임 환경의 컴포넌트
  • 다양한 최적화 수준에서 메서드를 컴파일
  • 최적화 레벨 키워드: cold, warm, hot, veryHot, scorching
  • 최적화 레벨이 높을수록 속도는 빨라지겠지만 CPU 및 메모리 측면에서는 컴파일 비용이 더 높아짐
  • 기본 최적화 레벨은 warm. 하지만 JIT 가 시작 시간을 개선하기 위해 최적화 레벨을 cold 로 다운그레이드 함.

JIT 컴파일러가 코드를 최적화 하는 방법

  • 컴파일용 메서드가 선택되면 JVM 은 JIT 컴파일러에게 해당 바이트 코드를 공급하여 동작
  • 메서드를 분석하는 데 용이하도록 바이트 코드를 트리로 정리. 그리고 분석 및 최적화 수행.
  • JIT 은 둘 이상의 컴파일 스레드를 사용하여 컴파일을 수행 할 수 있음

1. 인라이닝

소형 메서드 트리가 호출자 트리로 병합되거나 인라인 되는 프로세스

특징으로는 메서드 호출 오버헤드 감소

인라이닝 최적화 기술들

Simple Inlining: 단순 인라이닝

  • 작은 크기의 메서드에 대해 인라이닝을 적용
  • 호출 지점에 호출 대상 메서드의 코드가 삽입됨

Call Graph Inlining: 호출 그래프 인라이닝

  • 프로그램의 호출 트리를 분석하여 인라이닝을 결정
  • 전체 호출 트리에서 가장 효율적인 인라이닝을 수행

Tail Recursion Elimination: 후미 순환 제거

  • 재쉬 함수를 반복 루프로 변경

Virtual Call Guard Optimization: 가상 호출 보호 최적화

  • 다형성 메서드 호출에서 발생하는 가상 호출 오버헤드 감소를 위한 기법
  • 가상 호출의 동작을 분석, 가능 한 경우 실제 타입이 알려진 상태에서 인라이닝 수행.

2. 로컬 최적화

프로그램의 작은 부분에 대한 최적화를 수행하여 성능 향상

JIT 컴파일러의 구현에 따라 다르며 프로그램의 특성에 따라 결과가 달라질 수 있음

로컬 데이터 플로우 분석 및 최적화

변수와 연산의 사용을 분석하여 불필요한 연산 제거, 대체 연산 수행.

  • 상수 표현식 평가 후 상수로 알려진 변수에 대한 연산을 제거하거나 간소화

레지스터 사용 최적화

  • 변수를 레지스터에 할당하고 레지스터간 이동을 최소화하여 메모리 접근을 줄이고 성능을 개선
  • 데이터의 로딩과 저장에 필요한 오버헤드 감소

Java 관용 표현 단순화

  • 조건문을 단순화 하여 불필요한 흐름 제거

3. 제어 플로우 최적화

메소드 내부의 제어 플로우를 분석하고 코드 경로를 재배열 하여 효율성 향상

  • 코드 재정렬, 분할 및 제거
  • 루프 감소 및 반전
  • 루프 진행 속도 조정 및 루프 고정 코드 동작
  • 루프 롤 해제 및 분리
  • 루프 버전화 및 특수화
  • 예외 지시 최적화
  • 전환 분석

4. 글로벌 최적화

전체 메서드에서 동시 작동하는 최적화 기법

더 많은 컴파일 시간이 필요하지만 성능 향상폭이 큼

  • 글로벌 데이터 플로우 분석 및 최적화
  • 부분 중복 제거
  • 이스케이프 분석
  • GC 및 메모리 할당 최적화
  • 동기화 최적화

5. 원시 코드 생성

실행 시점 중간 중간 네이티브 기계 코드를 생성하는 방법.

런타임 도중에 생성 되므로 실행 환경에 맞게 최적화를 수행함