成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

解析Java橫死之謎,氣定神閑看花開花落

開發(fā) 后端
Java進(jìn)程突然不見了,日志里并沒有任何它們的信息,它們就那么憑空蒸發(fā)了。日志、OOM的一些配置參數(shù),根本就不頂用。

[[358408]]

本文轉(zhuǎn)載自微信公眾號(hào)「小姐姐味道  」,作者小姐姐養(yǎng)的狗 。轉(zhuǎn)載本文請(qǐng)聯(lián)系小姐姐味道公眾號(hào)。

Java進(jìn)程突然不見了,日志里并沒有任何它們的信息,它們就那么憑空蒸發(fā)了。日志、OOM的一些配置參數(shù),根本就不頂用。

不要驚慌。進(jìn)程沒有靈魂。一個(gè)restart,會(huì)讓這些程序活蹦亂跳again。

問題是那些restart也無法解決的問題,還有默默在背后運(yùn)作的墨菲定律。

是誰(shuí)殺死了心愛的Java進(jìn)程?

不要太絕情,在死之前,起碼要讓進(jìn)程發(fā)表一點(diǎn)遺言吧。本小篇將分析幾種常見的Java進(jìn)程消失之謎,讓你氣定神閑看花開花落。

它們有可能:

  • 被操作系統(tǒng)審判了
  • 執(zhí)行了上帝函數(shù),被隊(duì)友埋坑了
  • 使用了錯(cuò)誤的啟動(dòng)方式
  • 日志系統(tǒng)配置錯(cuò)誤

1. 被操作系統(tǒng)審判了

以下問題已經(jīng)不止一個(gè)小伙伴遇到了:我的java進(jìn)程沒了,什么都沒留下,直接蒸發(fā)不見了。

why?是因?yàn)樘嗲椋瑢?duì)象太多了么?

這是趣味性和技巧性非常突出的一個(gè)問題。

執(zhí)行dmesg命令,大概率會(huì)看到你的進(jìn)程崩潰信息躺尸在那里。

 

為了能看到發(fā)生的時(shí)間,我們習(xí)慣性加上參數(shù)T

  1. dmesg -T 

明顯是操作系統(tǒng)看你的進(jìn)程不順眼,給Kill了。

這個(gè)現(xiàn)象,和Linux的內(nèi)存管理有關(guān)。

由于Linux系統(tǒng)采用的是虛擬內(nèi)存分配方式,JVM的代碼,庫(kù),堆和棧的使用都會(huì)消耗內(nèi)存,但是申請(qǐng)出來的內(nèi)存,只要沒真正access過,是不算的,因?yàn)闆]有真正為之分配物理頁(yè)面。

隨著使用內(nèi)存越用越多。第一層防護(hù)墻就是SWAP;當(dāng)SWAP也用的差不多了,會(huì)嘗試釋放cache;當(dāng)這兩者資源都耗盡,殺手就出現(xiàn)了。oom killer會(huì)在系統(tǒng)內(nèi)存耗盡的情況下跳出來,選擇性的干掉一些進(jìn)程以求釋放一點(diǎn)內(nèi)存。

 

所以這時(shí)候我們的Java進(jìn)程,是操作系統(tǒng)“主動(dòng)”終結(jié)的,JVM連發(fā)表遺言的機(jī)會(huì)都沒有。這個(gè)信息,只能在操作系統(tǒng)日志里找。

要解決這種問題,首先不能太貪婪。比如一共8GB的機(jī)器,你把整整7.5GB分配給了JVM。當(dāng)操作系統(tǒng)內(nèi)存不足,你的JVM就可能成為oom-killer的獵物。

不過,通過下面的命令,可以讓進(jìn)程避免被審判。

  1. echo -17 > /proc/[PID]/oom_adj 

這是因?yàn)椋琽om_adj文件,就是進(jìn)程被oom killer殺掉的權(quán)重,一般介于 [-17,15]之間。越高的權(quán)重,意味著更可能被oom killer選中。

一旦你這么做,你的Java進(jìn)程就是特權(quán)階層了,可以無視規(guī)則。

2. 執(zhí)行了上帝函數(shù)

xjjdog對(duì)這個(gè)函數(shù)的評(píng)價(jià)是:比你起認(rèn)識(shí)它,還不如你不認(rèn)識(shí)它。

這位函數(shù)你不要瞅我。說的就是你,System.exit。

這個(gè)函數(shù)危險(xiǎn)得很,它將強(qiáng)制終止我們的應(yīng)用,而且什么都不會(huì)留下。你應(yīng)該掃描你的代碼,確保這樣的邏輯不會(huì)存在。

相信我,你并沒有需要用程序判斷來立即結(jié)束進(jìn)程的需求,業(yè)務(wù)系統(tǒng)尤其沒有。如果有,那大概率是不合理的。除非你把Java當(dāng)腳本用了。

這個(gè)函數(shù),是一個(gè)非常高級(jí)的埋坑技能,尤其是在Android之類的應(yīng)用中。應(yīng)用程序崩潰,你將什么原因都分析不到,哪怕你做了ShutdownHook。

使用exit函數(shù),一定要心存善意。

當(dāng)然我們并不是對(duì)此束手無策。下面這段代碼,就可以阻止exit的執(zhí)行,霸道非凡。上帝的那只手,也給掰回去。

  1. import java.security.Permission; 
  2.  
  3. public class S { 
  4.     private static class ExitTrappedException extends SecurityException { 
  5.     } 
  6.     private static void forbidSystemExitCall() { 
  7.         final SecurityManager securityManager = new SecurityManager() { 
  8.             public void checkPermission(Permission permission) { 
  9.                 if (permission.getName().startsWith("exitVM")) { 
  10.                     throw new ExitTrappedException(); 
  11.                 } 
  12.             } 
  13.         }; 
  14.         System.setSecurityManager(securityManager); 
  15.     } 
  16.     private static void enableSystemExitCall() { 
  17.         System.setSecurityManager(null); 
  18.     } 
  19.     public static void main(String[] args) { 
  20.         forbidSystemExitCall(); 
  21.         try { 
  22.             System.exit(0); 
  23.         }catch (Exception ex){ 
  24.             ex.printStackTrace(); 
  25.         } 
  26.         System.out.println("謝謝xjjjdog, 我依然能夠執(zhí)行"); 
  27.     } 

如果你用盡千方百計(jì),都找不到異常終止的原因,試試掛上這段代碼吧。有可能是救命的哦。

3. 錯(cuò)誤的啟動(dòng)方式

再聊一種最初級(jí)最常見還經(jīng)常發(fā)生的一種情況,會(huì)造成應(yīng)用程序的意外死亡:那就是對(duì)Java程序錯(cuò)誤的啟動(dòng)方式。

很多同學(xué)對(duì)Linux不是很熟悉,使用XShell登陸之后,調(diào)用下面的命令進(jìn)行啟動(dòng)。

  1. java com.cn.AA & 

這位同學(xué)還算有點(diǎn)意識(shí),在最后使用了&號(hào),以期望進(jìn)程在后臺(tái)運(yùn)行。但可惜的是,很多情況下,隨著XShell Tab頁(yè)的關(guān)閉,或者等待超時(shí),后面的Java進(jìn)程就隨著一塊停止了,很讓人困惑。 

正確的啟動(dòng)方式,就是使用nohup關(guān)鍵字,或者阻塞在其他更加長(zhǎng)命的進(jìn)程里(比如docker)。

  1. nohup java com.cn.AA & 

所以,當(dāng)你登錄上終端tty的時(shí)候,一定要鬧明白當(dāng)前執(zhí)行的父進(jìn)程是誰(shuí)。你可能是所有接下來要運(yùn)行的所有進(jìn)程的祖先哦。

4.日志配置錯(cuò)誤

如果上面的原因都不是,那大概率是你的項(xiàng)目里面日志框架的配置錯(cuò)誤了。Java中的日志框架繁多,配置方式多樣,一不小心,就會(huì)踩坑。即使你用的是SpringBoot,也會(huì)因?yàn)橐蕾嚢膯栴},造成啟動(dòng)問題。

日志配置錯(cuò)誤+異常情況,當(dāng)然是什么都不會(huì)留下。

使用下面的命令,可以將依賴樹轉(zhuǎn)移到log文件里進(jìn)行分析。

  1. mvn dependency:tree > dep.log 

如果是SpringBoot項(xiàng)目,是可以給main類加點(diǎn)代碼的。

  1. public static void main(String[] args) { 
  2.   try { 
  3.    SpringApplication.run(LinkpowerDtulockApplication.class, args); 
  4.   } catch (Exception e) { 
  5.    System.out.println(e); 
  6.   } 

這樣有什么異常情況,就可以早點(diǎn)發(fā)現(xiàn)。

End另外,還有一些千奇百怪的原因。比如磁盤滿了,句柄不夠了,這些情況都很隱蔽,需要你精確把控系統(tǒng)的細(xì)節(jié)。

進(jìn)程這種靜悄悄的死亡方式,通常會(huì)給我們的問題排查帶來更多的困難。

通常,我們?cè)陉P(guān)閉服務(wù)的時(shí)候,會(huì)使用“kill -15”,而不是“kill -9”,以便讓服務(wù)在臨死之前喘口氣。但并不總是有效,因?yàn)槌绦驂焊蜎]有機(jī)會(huì)發(fā)表遺言,有更高級(jí)別的存在阻止了它。Java進(jìn)程橫死,我們只能尋找其他手段。 

作者簡(jiǎn)介:小姐姐味道 (xjjdog),一個(gè)不允許程序員走彎路的公眾號(hào)。聚焦基礎(chǔ)架構(gòu)和Linux。十年架構(gòu),日百億流量,與你探討高并發(fā)世界,給你不一樣的味道。我的個(gè)人微信xjjdog0,歡迎添加好友,進(jìn)一步交流。

 

責(zé)任編輯:武曉燕 來源: 小姐姐味道
相關(guān)推薦

2011-12-22 16:22:16

收購(gòu)

2018-03-27 11:37:02

iOS程序面試

2021-08-04 10:32:34

人工智能機(jī)器學(xué)習(xí)技術(shù)

2020-12-30 14:07:12

人工智能人工智能應(yīng)用

2012-08-08 13:39:28

Google TV智能電視谷歌電視

2009-06-15 17:05:02

IP通信

2014-12-25 19:06:13

數(shù)據(jù)泄露

2011-06-28 13:43:50

Java EE

2018-04-12 14:26:50

2013-08-02 09:34:11

平臺(tái)即服務(wù)PaaSPaaS平臺(tái)

2012-03-28 09:48:45

2011-07-06 12:04:53

架構(gòu)

2020-05-13 11:19:30

SaaS云計(jì)算技術(shù)

2012-10-30 14:41:56

2009-03-01 21:13:27

iPhone蘋果3G

2015-05-28 20:46:06

2013-03-01 11:00:23

2009-11-19 11:03:51

Oracle LogM

2013-03-18 00:16:53

2015-04-24 10:53:11

LTE4G
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 91国产在线播放 | 国产精品中文字幕在线 | 久久男人天堂 | 国产精品久久久久久久毛片 | 精品日本久久久久久久久久 | 亚洲欧美自拍偷拍视频 | 97久久超碰 | 精品九九九 | 中文字幕在线观看视频网站 | 国产精品永久 | 日本精品视频在线观看 | av大片在线观看 | 欧美一区二区在线播放 | 午夜精品久久久久久久星辰影院 | 欧美在线观看一区二区 | 99reav| 麻豆hd| 欧美午夜视频 | 国产探花在线精品一区二区 | 中文字幕亚洲欧美日韩在线不卡 | 国产一二三视频在线观看 | 日韩毛片| 亚洲精品乱码久久久久久蜜桃91 | 91精品国产91久久综合桃花 | 天天视频一区二区三区 | 伊人免费观看视频 | 久久精品视频在线播放 | 亚洲色图综合 | 久久中文字幕一区 | 亚洲国产精品久久人人爱 | 日韩一区二区三区在线观看 | 久久久久亚洲精品国产 | 成人午夜在线观看 | 欧美视频网| 毛片a级| 国产成人在线视频免费观看 | 九九亚洲精品 | 亚洲综合天堂网 | 中文字幕在线人 | 中文一级片 | 久久久久久久久中文字幕 |