CompilerThread

EXEM Knowledge Base

Jump to: navigation, 찾기

목차

[편집] 개요

Sun Hotspot JVM에서 Hotspot Compiler 기능을 담당하는 Thread가 CompilerThread이다. CompilerThread는 Java Bytecode를 최적화(Optimization)하는 역할을 한다. 이러한 최적화 덕분에 JVM의 성능이 최근에 비약적으로 개선되었다.

[편집] Hotspot Compiler 버그와 JVM Crash

하지만, 간혹 Hotspot Compiler의 버그로 인해 JVM이 Crash되는 경우가 있다. CompilerThread의 버그로 인해 JVM Crash가 발생하는 경우에는 다음과 같은 내용의 Fatal Error Log가 기록된다. 아래 Log는 java.util.Arrays.mergeSort 메소드를 최적화하는 과정에서 Crash가 발생했음을 의미한다.

#
# An unexpected error has been detected by HotSpot Virtual Machine:
#
# Internal Error (4A41564123414C4C530E4350500018), pid=2872, tid=2884
#
# Java VM: Java HotSpot(TM) Server VM (1.5.0_05-b05 mixed mode)

----------------------------------------------------------------------------
T H R E A D
----------------------------------------------------------------------------
Current thread (0x6dd02218): JavaThread "CompilerThread1" daemon [_thread_in_vm, id=2884]

Stack: [0x6e3e0000,0x6e4e0000)
[error occurred during error reporting, step 110, id 0xc0000005]

Current CompileTask:
opto:1582 java.util.Arrays.mergeSort([Ljava/lang/Object;[Ljava/lang/Object;IIILjava/util/Comparator;)V (235 bytes)

----------------------------------------------------------------------------
P R O C E S S
----------------------------------------------------------------------------
Java Threads: ( => current thread )
0x6ef2d048 JavaThread "Dispatcher-Thread-2347" daemon [_thread_blocked, id=4068]
0x6fe3d650 JavaThread "http-443-Processor50" daemon [_thread_in_native, id=1996]
...

[편집] Hotspot Compiler 버그에 대한 Workaround

[편집] .hotspot_compiler 파일 이용

.hotspot_compiler 파일을 이용해서 Crash를 유발하는 메소드를 제외시킴으로써 Hotspot Compiler 버그를 우회적으로 회피할 수 있다. 아래와 같이 문제가 되는 메소드를 제외하는 내용을 기록하고 이 파일을 JVM이 실행되는 디렉토리에 저장하면 된다.

#.hotspot_compiler file
exclude java/util/Arrays mergeSort
...

[편집] Client VM

Server VM은 Client VM에 비해서 최적화를 많이 수행한다. 이 와중에서 예상치 못한 버그로 인해 Crash가 발생할 수 있다. Server VM을 사용하는 환경에서 Hotspot Compiler Bug로 인해 Crash가 지나치게 자주 발생할 경우에는 Server VM 대신 Client VM을 사용함으로써 에러를 피할 수 있다.

java -client ...

Client VM을 사용할 경우 Server Application에서는 다소의 성능 저하 현상이 생길 수 있다.

[편집] Interpreter 모드

JIT Compiler 대신 Interpreter 모드를 사용하면 Compile과정 자체가 발생하지 않으므로 Crash 현상을 피할 수 있다.

java -Xint ...

Interpreter 모드를 사용할 경우 JIT Compiler를 사용할 때에 비해 뚜렷한 성능 저하 현상이 생길 수 있다.

[편집] JVM Upgrade

항상 최신의 JVM으로 Upgrade하는 것 또한 중요하다.