最近項目做完,對一個接口應該壓測的時候,測試人員反饋,並發從1加到10的時候,tps(每秒鍾request/事務 數量)會遇到越來慢,並且內存使用率很高。
看了具體的代碼,也就是很簡單的crud的操作,確認是有一些代碼對數據庫的查詢有冗余,查詢了兩次。懷着試試的態度把代碼修改成了查詢一次。又試了一次,發現問題還是沒有解決掉。最終定位到因為這個接口接收的參數中base64的數據,這個方法的第一句就是
1 logger.info("收到的參數:"+str);
因為收到的數據參數比較大,並且打印日志的是使用字符串拼接的方式,這樣就會造成創建String對象的時候創建大量的資源。因為String對象是不可變的,所以會消耗大量的堆內存。修改打印日志的方法
1 logger.info("收到的參數:{}",str);
可以修改這樣的,使用占位符,對於占位符的形式而言,只有在我們需要的時候才會提取字符串,這樣就會避免創建string對象的時候消耗大量的資源。
總結:寫每行代碼都應該深思熟慮,簡單的一句日志輸出,造成了很大的性能問題,還有tps變慢。得不償失!!!