引入:
上文提到了JDI的Mirror機制,把整個目标虛拟機上的所有資料、類型、域、方法、事件、狀态和資源,以及調試器發向目标虛拟機的事件請求等都映射成Mirror 對象。這裡進一步讨論JDI的連結子產品。
分析:
連接配接子產品其主要目的是提供調試器(Debugger)到目标虛拟機(Target VM)之間的互動通道。
從連接配接的發起方來看:連接配接的發起方可以是調試器,也可以是目标虛拟機。
從連接配接的數量來看,一個調試器可以連接配接多個目标VM, 但是一個目标VM隻可以連接配接一個調試器。
我們從調試器(Debugger)的角度,可以把連接配接分為主動連接配接和被動連接配接。
分類1:主動連接配接 (它表示調試器主動去連接配接Target VM)
又分兩種情況:
a. 當Target VM還沒啟動時,則使用LaunchingConnector這種形式的連接配接器,它會啟動目标VM并連接配接。
Step 1: 調試器調用 VirtualMachineManager 的 launchingConnectors()方法擷取所有的LaunchingConnector的執行個體。
Step 2:根據傳輸方式或其他特征選擇一個LaunchingConnector,調用其 launch() 方法啟動并且連接配接目标虛拟機 。啟動後,傳回目标虛拟機的執行個體。
比如說,如果選用SocketLaunchingConnectorImpl,則它的launch()方法如下:
b.當Target VM已經啟動時,則使用AttachingConnector這種形式的連接配接器,它會挂接到目标虛拟機上。
前提是,Target VM必須以以下方式啟動 -agentlib:jdwp=transport=xxx,server=y 參數啟動,并根據傳輸方式生成監聽位址。
Step1:調試器啟動,調用 VirtualMachineManager 的 attachingConnectors() 方法擷取所有的AttachingConnector的執行個體。
Step 2: 根據目标虛拟機采用的傳輸方式選擇一個AttachingConnector,調用其 attach() 方法挂接到目标虛拟機上。完成連接配接後,傳回目标虛拟機的執行個體。
分類2:被動連接配接(它表示Debugger被動地等待或者監聽由Target VM發起的連接配接)
前提是,Target VM必須以以下方式啟動 -agentlib:jdwp=transport=xxx,address=yyy 參數啟動,并根據傳輸方式生成監聽位址。
Step 1:調試器通過 VirtualMachineManager 的 listeningConnectors() 方法擷取所有的ListeningConnector執行個體。
Step 2:調用ListeningConnector的 startListening() 方法讓連接配接器進入監聽狀态。通過 accept() 方法通知連接配接器開始等待正确的入站連結,該方法将傳回調試器正在監聽的位址描述符;目标虛拟機會自動地 attach 到調試器上建立連接配接,然後傳回目标虛拟機的執行個體。