Page tree
Skip to end of metadata
Go to start of metadata


-XX:compileThreshold=N

컴파일 임계치 설정 option이다. N의 default 값은 -client (C1)는 1500, -server (C2)는 10000 이다. 그런데 궁금한게 생겼다. 컴파일 임계치를 0 또는 1로 설정하면 어떻게 될까? (임계치에 대한 설명은 여기)


개 간단 예제
public class MemoryTestLoop {

    public static void main(String[] args) {

        List<String> temp = new ArrayList<>();

        while (true) {
            String tempString = "aaa";
            System.out.println(tempString);
            temp.add(tempString);
        }
    }

}


임계치 default 설정

오래 실행해보진 않았지만, 컴파일된 클래스가 160개로 계속 찍힌다.

-XX:compileThreshold=0

임계치 설정은 최소가 1인가보다. 0은 에러를 뿜는다. 그렇다고 코드가 실행 안되는건 아니다.

-XX:compileThreshold=1

예상과 다르게 바로 모든 클래스를 컴파일 하진 않는다. 일정 시간을 두고 컴파일된 클래스 카운트가 올라가는걸 보면 단순히 임계치 카운트만으로 컴파일하는건 아닌거 같다.

JIT 컴파일 과정을 이해했다면, 왜 처음 실행 부터 모든 코드를 컴파일 하지 않는지 이해 할 수 있다. 이유는 간단하다. 바이트 코드 실행과 컴파일은 서로 다른 스레드가 비동기로 처리하기 때문이다. 시간차가 있을 수 밖에 없다.

결론은 임계치 설정을 낮게하면 컴파일까지 도달하는 시간이 적은건 사실이지만, 그렇다고 바로 하는것도 아니다.

그리고 테스트 환경에 code cache 영역 크기가 약 240mb (티어드 컴파일을 사용하는 32/64bit 서버, 자바8 환경의 기본값) 정도되는데, 임계치를 1로 설정해도 약 5mb 내외의 크기만 차지한다 (위 예제를 기준으로). 1000개가 넘는 코드가 컴파일 된다고 그렇게 많은 용량을 차지하는건 아닌거 같다. (괜히 쫄았다.)



  • No labels