1.現象
在使用 IDE 調試 Java 代碼時,不僅阻塞目前的線程,還會阻塞其他線程的執行。 比如斷點一個 AController 中的方法,當這個調試不釋放時,後續的請求都會被阻塞,即使是通路 BController 中的方法,也會阻塞。
2.說明
這是因為斷點的設定是阻塞整個 JVM。其設定如下圖:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHLxEFRPRTVU90MNpHW4Z0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL5YTO2MTMzUTMzAjNwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
在斷點的詳細設定裡可以選
阻塞整個JVM
還是
阻塞線程
,預設一般是阻塞整個JVM。這裡的阻塞整個 JVM,并不是讓 JVM 處于什麼特殊的狀态,隻是執行到的線程被挂起了。其實所有的調試都是遠端調試,都通過 JDWP 完成調試,可檢視 IDE 運作時參數:
JDWP 相關資料可檢視:JDWP 協定及實作
預設阻塞整個JVM的好處是:
- 代碼調試時不會被其他一些任務幹擾,如:前端發送了一個新的請求,這個請求中也有斷點,焦點就到了斷點的位置
- 調試的資料可能是線程共享的,避免調試過程中資料被修改。
阻塞線程場景:
如果需要調試的程式沒有自動請求,或者臨時在公共環境(比如說QA)上調試(你可以快速啟用斷點,發請求,阻塞住後立馬禁用斷點,這樣一般不會妨礙到其他同僚通路),或者确實要實時調試多線程,那麼就可以選擇阻塞線程。