午夜剧场伦理_日本一道高清_国产又黄又硬_91黄色网战_女同久久另类69精品国产_妹妹的朋友在线

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

java - Tomcat的Spring-MVC項(xiàng)目在重啟一段時(shí)間后變卡

瀏覽:216日期:2024-01-09 16:32:46

問(wèn)題描述

最近更新了程序之后,發(fā)現(xiàn)網(wǎng)頁(yè)在tomcat重啟一陣子之后變得異常的卡。不知道為什么。發(fā)現(xiàn)了好多內(nèi)存泄漏的警告,覺(jué)得是不是因?yàn)椴徽5年P(guān)閉導(dǎo)致內(nèi)存不足呢,就試了幾個(gè)方法。

最先試著把tomcat的context.xml里面設(shè)置緩存最大值,貌似設(shè)到了100000,啟動(dòng)后發(fā)現(xiàn)速度不錯(cuò),但過(guò)了一段時(shí)間又卡得不得了了。再之后把服務(wù)器的內(nèi)存調(diào)大了,問(wèn)題還是照樣出現(xiàn)。而且每次系統(tǒng)的緩存只會(huì)越來(lái)越多,不會(huì)減少。java - Tomcat的Spring-MVC項(xiàng)目在重啟一段時(shí)間后變卡

上網(wǎng)看了一些類(lèi)似問(wèn)題的回答,有人說(shuō)是java獲取數(shù)據(jù)庫(kù)的效率不高而造成的,但是我覺(jué)得我這個(gè)問(wèn)題應(yīng)該不是出在這,因?yàn)橛泻芏嘈枰@取數(shù)據(jù)庫(kù)的函數(shù)代碼都變,以前就沒(méi)有出現(xiàn)過(guò)這種問(wèn)題,為什么現(xiàn)在變成這樣呢?不過(guò)最近倒是有一些改動(dòng),例如添加了兩個(gè)TimerTask。倒覺(jué)得應(yīng)該問(wèn)題不回出在這里吧。

package x.xx.xxx;import java.util.Calendar;import java.util.Date;import java.util.List;import java.util.Timer;import java.util.TimerTask;import javax.annotation.Resource;import org.apache.log4j.Logger;import x.xx.xxx.ManagementStation;import x.xx.xxx.ManagementStationService;/** * 源代碼來(lái)自《java定時(shí)任務(wù),每天定時(shí)執(zhí)行任務(wù)》 * http://www.cnblogs.com/cvst/articles/5818233.html * */public class TimerManager { @Resource RemoteControlController remoteControlController;@Resource ManagementStationService managementStationService; @Resource ControllerStatusController controllerStatusController; // 時(shí)間間隔 private static final long PERIOD_DAY = 24 * 60 * 60 * 1000; private static final int START_TIME = 1; public void initTimerManager() {Calendar calendar = Calendar.getInstance();/*** 定制每日1:00執(zhí)行方法 ***/calendar.set(Calendar.HOUR_OF_DAY, START_TIME);calendar.set(Calendar.MINUTE, 0);calendar.set(Calendar.SECOND, 0);Date date = calendar.getTime(); // 第一次執(zhí)行定時(shí)任務(wù)的時(shí)間Date date2 = calendar.getTime();// 如果第一次執(zhí)行定時(shí)任務(wù)的時(shí)間 小于 當(dāng)前的時(shí)間// 此時(shí)要在第一次執(zhí)行定時(shí)任務(wù)的時(shí)間加一天,以便此任務(wù)在下個(gè)時(shí)間點(diǎn)執(zhí)行。如果不加一天,任務(wù)會(huì)立即執(zhí)行。if (date.before(new Date())) { date = this.addDay(date, 1);}Timer timer = new Timer();Timer timer2 = new Timer();UpdateDailyEletricPowerTimerTask task = new UpdateDailyEletricPowerTimerTask();// 安排指定的任務(wù)在指定的時(shí)間開(kāi)始進(jìn)行重復(fù)的固定延遲執(zhí)行。timer.schedule(task, date, PERIOD_DAY);UpdateLampStatusTimerTask task2 = new UpdateLampStatusTimerTask();timer2.schedule(task2, date2, PERIOD_DAY); } // 增加或減少天數(shù) public Date addDay(Date date, int num) {Calendar startDT = Calendar.getInstance();startDT.setTime(date);startDT.add(Calendar.DAY_OF_MONTH, num);return startDT.getTime(); } public class UpdateDailyEletricPowerTimerTask extends TimerTask { private Logger log = Logger.getLogger(UpdateLampStatusTimerTask.class);@Overridepublic void run() { try {/** * 查詢(xún)前昨兩天日凍結(jié)正向有功總電量 */Calendar now = Calendar.getInstance();int year = now.get(Calendar.YEAR) - 2000;int month = now.get(Calendar.MONTH) + 1;int day = now.get(Calendar.DATE);remoteControlController.dailyPositiveElectricPowerCollecting(year, month, day); } catch (Exception e) {log.info('-------------NFDFlightDataTimerTask解析信息發(fā)生異常--------------'); }} }public class UpdateLampStatusTimerTask extends TimerTask { private Logger log = Logger.getLogger(UpdateLampStatusTimerTask.class);@Overridepublic void run() { try {/** * 更新全部燈具狀態(tài) */List<ManagementStation> mlist = managementStationService.getManagementStationList();StringBuffer temp=new StringBuffer('');for(ManagementStation m:mlist) temp.append(m.getMid()+',');String[] arr = temp.toString().split(',');boolean realTime = false;controllerStatusController.UpdateControllerStatus(arr,realTime); } catch (Exception e) {log.info('-------------UpdateLampStatusTimerTask解析信息發(fā)生異常--------------'); }} }

不過(guò)系統(tǒng)變得死卡死卡的的時(shí)候其實(shí)是開(kāi)啟thread和進(jìn)行socket通訊之后。不過(guò)不知道問(wèn)題出在前置機(jī)于客戶(hù)端的通訊那,還是我這邊的系統(tǒng)程序問(wèn)題,下面是系統(tǒng)接收返回信息的線程,請(qǐng)各位大蝦過(guò)目過(guò)目,謝謝。

private Status<OperationReturnMsgInfo> GetReturnedInfo(int frame_no) throws Exception{FrameController.addFrameToSendingQueue(frame_no);Status<OperationReturnMsgInfo> status=new Status<OperationReturnMsgInfo>();long beginTime = System.currentTimeMillis();boolean over_runtime = false;/** * 如果超過(guò)最大接收時(shí)間RUNTIME_MAX就直接把接收到的信息返回頁(yè)面 * 其他的報(bào)文繼續(xù)在后臺(tái)進(jìn)行接收 */while(FrameController.getExpectReutrnedFrameAmount(frame_no) != 0){ Thread.sleep(1000); long nowTime = System.currentTimeMillis(); over_runtime = nowTime - beginTime > RUNTIME_MAX? true : false; if(over_runtime) break;//超時(shí)跳出}List<byte[]> return_frames = FrameController.GetReturnedFrame(frame_no);List<OperationReturnMsgInfo> olist= new ArrayList<OperationReturnMsgInfo>();if(return_frames !=null){ for(byte[] return_frame:return_frames){List<OperationReturnMsgInfo> olisttmp = parseFrontEndMsg(return_frame);if(olisttmp != null) olist.addAll(olisttmp); } status.setCode(1);}else{ status.setCode(0);}status.setList(olist);if(!over_runtime){ FrameController.RecallFrameNo(frame_no);}else{ /** * 后臺(tái)處理超時(shí)沒(méi)有返回的報(bào)文 */ final int tmp_frame_no = frame_no; new Thread(new Runnable(){@Overridepublic void run() { int frame_no_in_the_thread = tmp_frame_no;//FIXME 有點(diǎn)問(wèn)題:如果tmp_frame_no在運(yùn)行到這行時(shí)被其他線程改變了,怎么辦? long beginTime = System.currentTimeMillis(); boolean over_runtime = false; int lastExpectReutrnedFrameAmount = FrameController.getExpectReutrnedFrameAmount(frame_no_in_the_thread); while(FrameController.getExpectReutrnedFrameAmount(frame_no_in_the_thread) != 0){try { Thread.sleep(1000);} catch (InterruptedException e) { e.printStackTrace();}long nowTime = System.currentTimeMillis();over_runtime = nowTime - beginTime > BG_RUNTIME_MAX? true : false;if(over_runtime) { //再超時(shí)便強(qiáng)制回收幀序號(hào),雖然暫時(shí)和直接回收沒(méi)有區(qū)別。 FrameController.CompulsivelyRecallFrameNo(frame_no_in_the_thread); return;}/** * 如果該幀返回報(bào)文有繼續(xù)更新,重置beginTime * 主要用于十分花時(shí)間的多報(bào)文返回操作RUNTIME_MAX的話就直接返回到頁(yè)面。 * 相當(dāng)于如果下一個(gè)報(bào)文返回間隔的時(shí)間大于RUNTIME_MAX就強(qiáng)行關(guān)閉對(duì)該幀的返回報(bào)文的接收 */if(lastExpectReutrnedFrameAmount != FrameController.getExpectReutrnedFrameAmount(frame_no_in_the_thread)){ lastExpectReutrnedFrameAmount = FrameController.getExpectReutrnedFrameAmount(frame_no_in_the_thread); beginTime = System.currentTimeMillis();} FrameController.RecallFrameNo(frame_no_in_the_thread);} }).start();}return status; }

問(wèn)題解答

回答1:

題主可以找一些分析工具,先捕捉一些有用的信息。變卡程序執(zhí)行過(guò)慢最有可能的原因是搶占資源cpu。

首先樓主可能使用 jstack pid 打印出線程堆棧,分析一下線程主要是在如何工作,程序運(yùn)行到哪行代碼,在做什么計(jì)算?在去逐一排查對(duì)應(yīng)的代碼問(wèn)題

如果jstack不夠樓主還可以使用xrebel/yourkit這類(lèi)工具輔助定位

回答2:

看題注描述,應(yīng)該是內(nèi)存泄漏引起資源搶奪導(dǎo)致。查找內(nèi)存泄漏不是一篇回答可以解決,還要結(jié)合具體代碼和情況分析,這里給出排查思路供參考:

配置Tomcat泄漏導(dǎo)出堆文件 具體參考如何配置tomcat產(chǎn)生heapdump

通過(guò)工具分析分析headdump文件,定位異常堆棧信息常規(guī)分析工具有IBM HeapAnalyzer、jhat、jmap,可以參考使用JMAP dump及分析dump文件

分析代碼中異常堆棧創(chuàng)建和銷(xiāo)毀是否存在異常,如未正常銷(xiāo)毀導(dǎo)致泄漏

建議樓主嘗試掌握方法來(lái)解決問(wèn)題,以后碰到此類(lèi)問(wèn)題就可以觸類(lèi)旁通了

標(biāo)簽: java
相關(guān)文章:
主站蜘蛛池模板: 国产www视频 | 国产成人三级在线观看视频 | 91香蕉国产在线观看软件 | 精品一区二区成人免费视频 | 国产九九精品视频 | 欧美 日韩 国产 精品 | 69亚洲精品 | 黄网站在线观看 | 国产午夜三级一区二区三 | 看av网站 | 久久在线免费视频 | 欧美一区二区三区四区五区六区 | 韩国黄色录像 | 日韩精品三区 | 国产免费一区二区三区 | 九九热视频这里只有精品 | 五月天婷婷在线视频 | 日本精品视频一区二区三区 | 成人夜视频 | 色偷偷超碰 | 9久久精品 | 91视频在线观看网站 | av日韩中文字幕 | 中国二级毛片 | 强开小嫩苞一区二区三区视频 | 久久视频免费看 | 成年人在线观看视频网站 | 全部免费毛片在线播放高潮 | 国产成年人免费视频 | xxxxx国产| 男人av的天堂 | 亚洲性天堂 | 另类综合视频 | 日韩经典一区二区 | av激情网| 色网站女女 | 成人一区二区在线观看 | 亚洲激情成人 | 国产精品一区在线免费观看 | 亚洲精品视频久久 | 久久精品在线视频 |