背景:

 

問(wèn)題:

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

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

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

 

解決:

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

故把對(duì)賬程序拆出后單獨(dú)部署后, 再?zèng)]出現(xiàn)服務(wù)訪問(wèn)超時(shí)情況。

 

分析,對(duì)賬時(shí),因?yàn)橐獡瞥霎?dāng)天支付數(shù)據(jù)到內(nèi)存進(jìn)行對(duì)賬(隨著業(yè)務(wù)發(fā)展訂單開(kāi)始猛增)故觸發(fā)了GC。其實(shí)增加分批limit當(dāng)然也可以解決

這是最近第二次踩到GC的坑了, 第一次是每次訪問(wèn)給每個(gè)線程分配的內(nèi)存過(guò)多,并發(fā)上來(lái)后性能?chē)?yán)重降低,導(dǎo)致WEB超時(shí),有必要總結(jié)下了

 

 

 

重現(xiàn)下:

 

死磕重現(xiàn)下,

 

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

萬(wàn)碼學(xué)堂,電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),Java培訓(xùn),JavaEE開(kāi)發(fā)培訓(xùn),青島軟件培訓(xùn),軟件工程師培訓(xùn)

/**
 * 模擬當(dāng)系統(tǒng)中使用大對(duì)象時(shí),對(duì)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)友評(píng)論