天天看點

為什麼使用IDE調試Java代碼時會阻塞整個程式?

1.現象

 在使用 IDE 調試 Java 代碼時,不僅阻塞目前的線程,還會阻塞其他線程的執行。 比如斷點一個 AController 中的方法,當這個調試不釋放時,後續的請求都會被阻塞,即使是通路 BController 中的方法,也會阻塞。

2.說明

 這是因為斷點的設定是阻塞整個 JVM。其設定如下圖:

為什麼使用IDE調試Java代碼時會阻塞整個程式?

 在斷點的詳細設定裡可以選

阻塞整個JVM

還是

阻塞線程

,預設一般是阻塞整個JVM。這裡的阻塞整個 JVM,并不是讓 JVM 處于什麼特殊的狀态,隻是執行到的線程被挂起了。其實所有的調試都是遠端調試,都通過 JDWP 完成調試,可檢視 IDE 運作時參數:

為什麼使用IDE調試Java代碼時會阻塞整個程式?

JDWP 相關資料可檢視:JDWP 協定及實作

預設阻塞整個JVM的好處是:

  • 代碼調試時不會被其他一些任務幹擾,如:前端發送了一個新的請求,這個請求中也有斷點,焦點就到了斷點的位置
  • 調試的資料可能是線程共享的,避免調試過程中資料被修改。

阻塞線程場景:

 如果需要調試的程式沒有自動請求,或者臨時在公共環境(比如說QA)上調試(你可以快速啟用斷點,發請求,阻塞住後立馬禁用斷點,這樣一般不會妨礙到其他同僚通路),或者确實要實時調試多線程,那麼就可以選擇阻塞線程。