Compiler Thread

概要

Sun Hotspot JVMでHotspot Compilerの機能を担当しているThreadが、CompilerThreadです。CompilerThreadは、Java Bytecodeを最適化(Optimization)する役割を担います。これらの最適化のおかげで、JVMの性能が、最近飛躍的に改善されました。

Hotspot CompilerバグとJVM Crash

Hotspot Compilerのバグが原因でJVMがCrashする場合があります。Compiler Threadのバグが原因で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バグの回避策

.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することも重要です。