System.out.println高併發下導致應用暫停

今天在進行序列號壓測的時候,通過調用genSeqId方法來獲取序列號,100併發,16臺壓測機器,發現無論怎麼壓測,調用量達到140w左右的時候,此方法的ops直接掉到了0,具體圖示如下:

企業咚咚20190805172354

從上圖可以明顯看到,整個ops呈現斷崖式下跌。

當時左思右想,不得其解,後來註釋掉代碼中的System.out.println後,然後再進行壓測,發現恢復正常:

 

企業咚咚20190805172329

上圖可以看到,壓到了一億的量後,由於沒有發現問題,就停止了壓測。

後來翻閱了一下System.out.println源碼,發現其並不適合高併發下的打印工作 ,原因在於其內部用了大量的Synchronized來進行同步操作,這樣就導致兩個請求之間需要進行同步等待操作。

更具體的說明,請參閱:https://softwareengineering.stackexchange.com/questions/246534/how-bad-is-it-calling-println-often-than-concatenating-strings-together-and-ca

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章