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

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

企業咚咚20190805172354

從上圖能夠明顯看到,整個ops呈現斷崖式下跌。高併發

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

 

企業咚咚20190805172329

上圖能夠看到,壓到了一億的量後,因爲沒有發現問題,就中止了壓測。get

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

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

相關文章
相關標籤/搜索