Java HotSpot仮想マシンでは、「フル・スピード・デバッグ」が使用されるようになりました。旧バージョンのHotSpotでは、デバッグが有効にされている場合、プログラムはインタプリタのみを使用して実行していました。このバージョンでは、HotSpotテクノロジのパフォーマンス面の利点を、デバッグが有効な状態で動作しているプログラムにおいて活かすことができます。パフォーマンスが向上すると、長時間動作するプログラムをより簡単にデバッグできるようになります。また、フル・スピードでテスティングを行ったり、例外上でデバッガを起動できるようになりました。
-Xrunjdwp:transport=dt_socket,server=y,onuncaught=y,launch=myDebuggerLaunchScript
「onthrow」の起動および「onuncaught」の起動の詳細は、「接続および呼出しの詳細」を参照してください。ブレークポイントを設定しても、ブレークポイントを含むメソッドのコンパイル(フル・スピード実行)が抑制されるだけです。実行は、シングルステップ実行などの一部のデバッグ操作時、およびメソッドの入口/出口またはウォッチポイントの設定時にインタプリタに戻ります。
バージョン1.4.1以降、フル・スピード・デバッグはJava HotSpot Client VM (デフォルト)とJava HotSpot Server VM (-server
コマンド行フラグで起動)の両方で使用できます。JDK 1.4.0では、フル・スピード・デバッグはJava HotSpot Client VMのみで使用可能でした。
これは、デバッガAPIを使用して実行中のアプリケーションで変更されたコードを置き換える機能をカプセル化する新機能です。たとえば、単一のクラスを再コンパイルし、古いインスタンスを新しいインスタンスに置き換えることができます。
この変更は、次のような問題に対処するために行われました。
HotSwapによって、デバッガの制御下でクラスを更新できる機能がJava Platform Debugger Architecture (JPDA)に追加されます。この機能の中心的なコンポーネントは、クラス定義を置き換えるRedefineClasses
と、再定義されたメソッドを再実行できるようにスタックからフレームをポップするPopFrame
の2つです。
リファレンス実装では、この機能はJava Virtual Machine Debug Interface (JVMDI)層で実装され、JPDAの上位層(Java Debug Wire Protocol (JDWP)およびJava Debug Interface (JDI))から使用できます。
JDI | VirtualMachine.redefineClasses(Map classToBytes) |
JDWP | RedefineClasses (Cmd 18) in VirtualMachine (CmdSet 1) |
JVMDI | RedefineClasses(jint classCount, JVMDI_class_definition *classDefs) |
JDI | ThreadReference.popFrames(StackFrame frame) |
JDWP | PopFrames (Cmd 4) in StackFrame (CmdSet 16) |
JVMDI | PopFrame(jthread thread) |
各層の機能はすべて独立したオプションです。JVMDI層のGetCapabilities
関数、JDWP層のCapabilitiesNew
コマンド、JDI層のcanRedefineClasses
、canAddMethod
、canUnrestrictedlyRedefineClasses
、およびcanPopFrames
メソッドには、どの機能が実装されているのかが記述されています。
この変更に関するバグ報告については、4287595を参照してください。
BreakpointRequest
、MethodExitRequest
、ExceptionRequest
、StepRequest
、WatchpointRequest
、およびMethodEntryRequest
クラスでは、addInstanceFilter
メソッドを使用してインスタンス・フィルタを追加する機能が提供されるようになりました。インスタンス・フィルタを使用すると、要求によって生成されるイベントが、現在実行中のインスタンスが指定されたオブジェクトであるイベントに制限されます。
パッケージ | 新しいAPI | コメントが変更されたAPI |
---|---|---|
JVMDI | GetSourceDebugExtension |
|
JDWP - ReferenceType (2)コマンド・セット |
SourceDebugExtension コマンド(12) |
|
JDWP - VirtualMachine (1)コマンド・セット |
SetDefaultStratum コマンド(19) |
|
JDK - VirtualMachine I/F |
void setDefaultStratum(String stratum) |
|
JDK - VirtualMachine I/F |
String getDefaultStratum() |
|
JDI - ReferenceType I/F |
String sourceNames(String stratum) |
String sourceName() |
JDI - ReferenceType I/F |
String sourcePaths(String stratum) |
|
JDI - ReferenceType I/F |
List allLineLocations(String stratum, String sourceName) |
List allLineLocations() |
JDI - ReferenceType I/F |
List locationsOfLine(String stratum, String sourceName, int lineNumber) |
List locationsOfLine(int lineNumber) |
JDI - ReferenceType I/F |
List availableStrata() |
|
JDI - ReferenceType I/F |
String defaultStratum() |
|
JDI - ReferenceType I/F |
String sourceDebugExtension() |
|
JDK - Method I/F |
List allLineLocations(String stratum, String sourceName) |
List allLineLocations() |
JDK - Method I/F |
List locationsOfLine(String stratum, String sourceName, int lineNumber) |
List locationsOfLine(int lineNumber) |
JDI - Location I/F |
|
クラス・コメント(strata定義済み) |
JDI - Location I/F |
int lineNumber(String stratum) |
int lineNumber() |
JDI - Location I/F |
String sourceName(String stratum) |
String sourceName() |
JDI - Location I/F |
String sourcePath(String stratum) |
|
JDI - Location I/F |
String sourcePath() |
|
VMDeathRequest
クラスを使用すると、ターゲットVM終了時の通知要求を行うことができます。有効なVMDeathRequest
が満たされると、VMDeathEvent
を含むEventSet
がEventQueue
に置かれます。
VMDeathRequest
を作成しない場合でも、SUSPEND_NONE
のsuspend policy
とともに非要請VMDeathEvent
が1つ送信されます。
この要求は通常、SUSPEND_ALL
の中断ポリシーを使用してVMDeathEvent
が送信されるように作成されます。このイベントは、VMが稼動していることが必要な処理(イベント処理など)の完了を確認するために利用できます。注: その場合も、非要請VMDeathEvent
は送信されます。