日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

由excel导出引起的cpu 100% 和gc 的问题

發(fā)布時(shí)間:2023/12/10 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 由excel导出引起的cpu 100% 和gc 的问题 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

大家好,我是烤鴨:
?? ?記一次 由excel導(dǎo)出 導(dǎo)致的cpu飆升200%,jvm 內(nèi)存不足。

1. ?場(chǎng)景復(fù)現(xiàn)


?? ?前端頁面導(dǎo)出Excel,之前導(dǎo)出4,5W條數(shù)據(jù)都沒什么問題的。
?? ?今天業(yè)務(wù)突然反饋說導(dǎo)出不了了,我試著導(dǎo)出了2w數(shù)據(jù),發(fā)現(xiàn)頁面卡住了,
?? ?沒有響應(yīng)了,查日志,報(bào)錯(cuò)如下。

java.lang.IllegalStateException: Cannot call sendRedirect() after the response has been committedat org.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.java:488)at javax.servlet.http.HttpServletResponseWrapper.sendRedirect(HttpServletResponseWrapper.java:138)

? ? ?查看了導(dǎo)出方法,發(fā)現(xiàn)如果repsonse在響應(yīng)過程中拋出異常的話,就會(huì)有類似的問題。

? ? ?
??? ?正常的話,因?yàn)樾枰彦e(cuò)誤信息帶到頁面,catch之后再return到對(duì)應(yīng)的頁面。
??? ?但如果是上圖所示的write方法,如果這地方報(bào)異常,就會(huì)出現(xiàn)
??? ?Cannot call sendRedirect() after the response has been committed 的異常。

? ? ?輸出文件的代碼如下,如果這時(shí)候異常。

/*** 輸出到客戶端* @param fileName 輸出文件名*/public ExportExcel write(HttpServletResponse response, String fileName) throws IOException{response.reset();response.setContentType("application/octet-stream; charset=utf-8");response.setHeader("Content-Disposition", "attachment;fileName=" + new String(fileName.getBytes("GBK"), "iso-8859-1")); //中文文件名處理write(response.getOutputStream());return this;}

? ? 知道這是寫法的問題,但是并沒有什么好的辦法解決。
?? ?因?yàn)?異常需要通過addMessage(redirectAttributes, e.getMessage()) 帶到重定向的頁面。

? ? 但是轉(zhuǎn)念一想,這個(gè)問題不應(yīng)該在這地方出現(xiàn),因?yàn)橹坝昧撕荛L(zhǎng)時(shí)間是沒有這個(gè)問題的。

2.?? ?尋找問題

? ? 再次執(zhí)行導(dǎo)出的時(shí)候,監(jiān)測(cè)了一下cpu,為啥,第六感吧。

top #查看cpu進(jìn)程運(yùn)行 ps -ef|grep tomcat_xxx #查看tomcat 的 pid

? pid 是 19021

? 發(fā)現(xiàn) 19021 的進(jìn)程爆表了...如下圖

??

jstat -gcutil 19021 5000 #每隔5秒打印一次gc

?又去看了gc的情況,每隔5秒打印一次gc,各個(gè)空間全都滿了。而且YGC和FGC的頻次和時(shí)間在迅速增加。(下圖中的時(shí)間還沒到滿的時(shí)候,后來確實(shí)都100了)

還好,服務(wù)器還撐得住,應(yīng)該是數(shù)據(jù)量不是特別大,沒有報(bào)java.lang.OutOfMemoryError。

jmap -heap 19021 #查看堆內(nèi)存詳細(xì)信息 jstack 19021 #查看線程問題(是否死鎖)

??其實(shí)我的問題在這就解決了,想了想最近改動(dòng)過的代碼,基本就鎖定了問題,導(dǎo)出時(shí)候的問題,
??后來查了excel工具類的代碼提交,發(fā)現(xiàn)在創(chuàng)建cell單元格的時(shí)候,沒有判斷樣式是否存在,
??只要是空單元格,就新創(chuàng)建一個(gè)單元格樣式。
??改之前:

CellStyle style = wb.createCellStyle(); cell.setCellStyle(style);

? 改之后:

if (val != null){CellStyle style = styles.get("data_column_"+column);if (style == null){style = wb.createCellStyle();style.cloneStyleFrom(styles.get("data"+(align>=1&&align<=3?align:"")));style.setDataFormat(wb.createDataFormat().getFormat(cellFormatString));styles.put("data_column_" + column, style);}cell.setCellStyle(style);}

? ? 不要小瞧了這個(gè)判空,原來的寫法會(huì)多創(chuàng)建2w行*20列=40w個(gè)對(duì)象,導(dǎo)致各個(gè)空間的滿了原因。
?? ?如果還沒找到問題的話,就輸出gc日志,慢慢查。

jmap -histo 9021>xxx.log #輸出gc日志到文件

? ??
3.?? ?總結(jié)

? ? 如果是gc或者內(nèi)存問題。

? ? 獲取當(dāng)前進(jìn)程pid

? ? ps -ef|grep tomcat_xxx 或者 ps -ef|grep java 或者 jps
? ? 查看cpu利用率?
?? ?top
? ? 監(jiān)測(cè)gc
?? ?jstat -gcutil pid 5000
? ? 查看堆內(nèi)存詳細(xì)信息
?? ?jmap -heap pid
? ? 查看是否死鎖情況
? ? jstack pid
? ? 還找不到的話,輸出gc的日志慢慢找
?? ?jmap -histo pid>xxx.logs
?

總結(jié)

以上是生活随笔為你收集整理的由excel导出引起的cpu 100% 和gc 的问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。