자바 성능 튜닝 / 스캇오크스 / 비제이퍼블릭
* JVM 의 Flag
- Boolean Flag
xx : +FlagName -> 해당 설정 사용
xx : -FlagName -> 해당 설정 미사용
- Parameter Flag
- xx : FlagName = yy => 특정 값으로 Flag 설정
* Logger
- log.log(Level.Fine, "x = " + calcX() + " y = " + calcY());
: 로그 레벨과 관계없이 calcX(), calcY() 를 수행하게 됨
- if (log.isLoggable(Level.Fine)) {
log.log(Level.Fine, "x = {} y = {}", new Object[] { calcX(), calcY()});
}
: 메서드도 호출되지 않고, 배열 객체의 할당도 일어나지 않는다
* Client 처리율 단위
- TPS (Transactions Per Sec) : 초당 트랜잭션 수
- RPS (Requests Per Sec) : 초당 요청 수
- OPS (Operations Per Sec) : 초당 동작 수
* Unix 분석 도구
- SAR (System Accounting Report)
: vmstat, iostat, prstat 등과 같은 구성 도구
* CPU 사용률
- 사용자 시간
: CPU가 App을 실행하는 시간의 백분율
- 시스템 시간
: CPU가 Kernel 코드를 실행시키는 시간의 백분율 (Disk I/O, Network I/O 등)
> 사용률을 높이면 작업을 처리하는 시간이 단축된다
* 자바 모니터링 도구
- jconsole
: Thread 사용률, Class 사용률, GC 활동내역, JVM 활동 내역을 그래픽 형태로 노출
- jhat
: 메모리 힙 덤프를 읽고 보냄
- jmap
: 힙 덤프와 JVM 메모리 사용률 정보를 제공
- jinfo
: JVM 의 특성에 대해 가시성을 제공하고 일부 시스템 특성을 동적으로 설정
- jstack
: java process 스택 덤프를 생성가능
- jstat
: GC 와 클래스 로딩 활동에 대한 정보 제공
- jvisualvm
: JVM 모니터링 + App 프로파일링 + 힙 덤프 생성
* Compilation
- C++ & Fortran
: source -> (compile) -> Binary (Assembly) -> 특정 CPU 에서 실행됨 (AMd or Intel 등)
- PHP & Perl
: source -> (interpreted) -> Interpreter (한줄씩, Code -> Binary) -> 해당 인터프리터를 가진 CPU 에서 실행됨
- Java
: source -> (compile) -> Assembly (Java Bytecode) -> (execute) -> Java Binary 가 JVM 에서 실행됨
* Hotspot VM
* Tiered Compilation
- C1 Compiler (= Client Compiler)
- C2 Compiler (= Server Compiler)
> JVM 시작 시에는 C1 을 쓰고, 그 다음에 코드가 많이 호출되면 C2를 사용
* Escape Analysis
- Compiler 의 최적화 기법 중의 하나
- 예로, Heap 할당된 객체의 참조가 특정 함수 밖으로 벗어나지 않는다면 (escape 되지 않는다면), Stack 을 사용하는 Local 변수로 최적화 시킨다
* Dangling
- 동적할당(Heap 할당) 에서 Memory 가 해제된 곳을 가리키는 포인터
* Concurrent Collector (CMS, G1 (Garbage First))
- 미사용 객체를 훓어보는동안 App Thread 를 멈추지 않고 처리할 수 있음