[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. 원시 코드 생성
실행 시점 중간 중간 네이티브 기계 코드를 생성하는 방법.
런타임 도중에 생성 되므로 실행 환경에 맞게 최적화를 수행함