背景:
問題:
有個(gè)渠道支付服務(wù),負(fù)責(zé)與所有支付相關(guān)服務(wù)進(jìn)行交互,包括 渠道下單支付,渠道成功通知,渠道的對賬等
服務(wù)4臺(tái)機(jī),平時(shí)跑的都很穩(wěn)定,通過thrift進(jìn)行對外提供服務(wù),且平時(shí)并未發(fā)現(xiàn)訪問超時(shí)的情況,已經(jīng)平穩(wěn)在線上跑了1年多了,沒出現(xiàn)過超時(shí)問題。
但最近發(fā)現(xiàn),每天到了晚上凌晨2點(diǎn)開始大量服務(wù)訪問超時(shí),且定位到每次都是搶到對賬任務(wù)的那臺(tái)服務(wù)出現(xiàn)問題。
解決:
后通過監(jiān)控和打印GC日志發(fā)現(xiàn),出現(xiàn)問題機(jī)器服務(wù)的Major GC頻率增加,應(yīng)該是內(nèi)存問題。
故把對賬程序拆出后單獨(dú)部署后, 再?zèng)]出現(xiàn)服務(wù)訪問超時(shí)情況。
分析,對賬時(shí),因?yàn)橐獡瞥霎?dāng)天支付數(shù)據(jù)到內(nèi)存進(jìn)行對賬(隨著業(yè)務(wù)發(fā)展訂單開始猛增)故觸發(fā)了GC。其實(shí)增加分批limit當(dāng)然也可以解決
這是最近第二次踩到GC的坑了, 第一次是每次訪問給每個(gè)線程分配的內(nèi)存過多,并發(fā)上來后性能嚴(yán)重降低,導(dǎo)致WEB超時(shí),有必要總結(jié)下了
重現(xiàn)下:
死磕重現(xiàn)下,
模擬業(yè)務(wù)部分,假使每個(gè)業(yè)務(wù)需要500ms返回,代碼如下:
/** * 模擬當(dāng)系統(tǒng)中使用大對象時(shí),對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