背景:

 

問題:

有個渠道支付服務(wù),負責與所有支付相關(guān)服務(wù)進行交互,包括 渠道下單支付,渠道成功通知,渠道的對賬等

服務(wù)4臺機,平時跑的都很穩(wěn)定,通過thrift進行對外提供服務(wù),且平時并未發(fā)現(xiàn)訪問超時的情況,已經(jīng)平穩(wěn)在線上跑了1年多了,沒出現(xiàn)過超時問題。

但最近發(fā)現(xiàn),每天到了晚上凌晨2點開始大量服務(wù)訪問超時,且定位到每次都是搶到對賬任務(wù)的那臺服務(wù)出現(xiàn)問題。

 

解決:

后通過監(jiān)控和打印GC日志發(fā)現(xiàn),出現(xiàn)問題機器服務(wù)的Major GC頻率增加,應(yīng)該是內(nèi)存問題。

故把對賬程序拆出后單獨部署后, 再沒出現(xiàn)服務(wù)訪問超時情況。

 

分析,對賬時,因為要撈出當天支付數(shù)據(jù)到內(nèi)存進行對賬(隨著業(yè)務(wù)發(fā)展訂單開始猛增)故觸發(fā)了GC。其實增加分批limit當然也可以解決

這是最近第二次踩到GC的坑了, 第一次是每次訪問給每個線程分配的內(nèi)存過多,并發(fā)上來后性能嚴重降低,導致WEB超時,有必要總結(jié)下了

 

 

 

重現(xiàn)下:

 

死磕重現(xiàn)下,

 

模擬業(yè)務(wù)部分,假使每個業(yè)務(wù)需要500ms返回,代碼如下:

萬碼學堂,電腦培訓,計算機培訓,Java培訓,JavaEE開發(fā)培訓,青島軟件培訓,軟件工程師培訓

/**
 * 模擬當系統(tǒng)中使用大對象時,對JVM造成的影響
 * 
 * @author 包子(何錦彬). 2017.01.07
 * @QQ 277803242 */@WebServlet("/Test")public class Test extends HttpServlet {    private static final long serialVersionUID = 1L;    private Logger logger = Logger.getLogger(Test.class.getName());    protected void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        long startTime = System.currentTimeMillis();   &n
        
		

網(wǎng)友評論