Chap. 14 성능향상시키기 PS Lab. 이지연
빠른 자바 가상 머신 JIT(just-in-time)컴파일러 자바 가상 머신으로부터 해석되는 바이트 코드를 플랫폼에 맞는 네이티브 코드로 바꾸어줌 클래스가 로드된 후에 네이티브로 변환 컴파일시 각 명령어에 대해서 많은 최적화 수행
간단한 가비지 콜렉션 과정 지역 변수 배열과 피연산자 스택에서 참조하는 각 객체를 “유효함”의 상태로 체크 유효하다고 체크된 각 객체의 필드들도 유효하다고 체크 필드가 참조하는 다른 객체에도 체크 과정 반복
세대별 가비지 콜렉션 세대별 가비지 콜렉션 메모리 압축 : 객체가 사용 중인 공간을 한 곳에 몰아넣는 것 오랫동안 유효했던 객체는 계속적으로 유효할 것이라는 전제로 객체들을 세대별로 묶음 오래된 객체보다 새로운 객체를 더 자주 검사 메모리 압축 : 객체가 사용 중인 공간을 한 곳에 몰아넣는 것
가비지 콜렉션
참조 구현하기 방법 : 1)메모리상의 객체에 대한 단일한 포인터 사용 2)포인터에 대한 포인터(핸들)로 구현 핸들 방법 : 1)메모리상의 객체에 대한 단일한 포인터 사용 2)포인터에 대한 포인터(핸들)로 구현 핸들 장점 : 메모리 상에서 객체를 옮기는 것이 쉬움 (핸들만 갱신하면 되기 때문) 단점 : 한번의 참조를 위해서 두번의 과정이 필요
참조를 구현하는 두 가지 방법
바이트 코드 최적화 기술 상수의 사용을 늘린다. 길이를 감소시킨다. 루프를 풀어서 기술한다. 틈새 최적화
바이트 코드 최적화 기술(계속) < 상수의 사용을 늘린다 > P. 459 코드 참조 iload_1 -> bipush 32 상수 사용을 늘리기 힘든 경우 포인터 쉐도잉 : 다른 2개의 포인터가 메모리상의 같은 공간을 가리키고 있는 것
바이트 코드 최적화 기술(계속) < 길이를 감소시킨다 > 오래 걸리는 작업을 동일한 효과를 내면서 좀 더 짧게 대체한다는 것 곱셈연산을 대체시킴 x*32 -> x<<5 x*34 -> x<<5 + x<<1 int seconds_in_a_day = 60*60*24; bipush 60 imul bipush 24 ldc 86400
바이트 코드 최적화 기술(계속) < 루프를 풀어서 기술한다 > 루프 안의 내용을 실행하는 것보다 루프문의 조건을 테스트하는데 많은 시간이 걸리는 경우 P.462,463 코드 참조
바이트 코드 최적화 기술(계속) < 틈새 최적화 > 결과값으로 나온 바이트 코드를 보고 필요없는 명령어를 제거하는 것 P.464,465 코드 참조 P.466 [표 14.1]틈새 최적화 규칙 참조
인라이닝 invoke 명령어는 호출하려는 코드 자체로 바뀜 P.468,469 코드 참조 인자값을 스택에 넣고 새로운 스택 프레임을 생성하고 결과를 처리하는 데 드는 오버헤드를 줄임 P.468,469 코드 참조 오버라이드가 불가능한 경우에만 인라이닝 가능 메소드나 클래스가 final인 경우와 정적메소드인 경우에만 가능
필드 인라이닝 final 필드에 적용 class Teapot { public final static long TIME_TO_BREW=180000; void makeTea() { Thread.sleep(TIME_TO_BREW); } } .method makeTea()V ldc2_w 180000 <- getstatic Teapot/TIME_TO_BREW J 의 대체코드 imvokestatic java/lang/Thread/sleep(J)V return .end method class TeaParty void chat() { Thread.sleep(Teapot.TIME_TO_BREW); }