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