与恐龙共舞 1. 内存报警
生活随笔
收集整理的這篇文章主要介紹了
与恐龙共舞 1. 内存报警
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
不要想歪了, 這個(gè)恐龍是那些古老的龐大項(xiàng)目. 有多大呢?
最新鮮的數(shù)據(jù), 正好在做sccs轉(zhuǎn)svn, 大概有8萬多次提交. 大概八年的項(xiàng)目.
庫有1G左右,都是代碼和代碼歷史..
這里記錄一些與恐龍共舞的經(jīng)驗(yàn), 不愉快的記憶最容易被遺忘, 還是記錄一下.
1. 內(nèi)存報(bào)警
這個(gè)報(bào)警是個(gè)老問題, 很多客戶都有這個(gè)問題, 是個(gè)老大難. 以前有人改過, 貌似沒用. 輪到我接手, 硬著頭皮上吧.
首先看代碼....暈....這個(gè)代碼風(fēng)格, 不, 應(yīng)該說整個(gè)項(xiàng)目都是, 文檔幾乎沒有了. 有也對(duì)不上, 在無數(shù)的改進(jìn)和bug fix以后幾乎慘不忍睹. 慘點(diǎn)還不算, 還不能format代碼, 因?yàn)榇a變化太大, diff出來沒法看. 這個(gè)不同的縮進(jìn), linux, windows, vim, eclipse下不同的工具下出來的代碼真是百花齊放. 后來我找到訣竅. format之后再還原.
代碼很暈, 誰知道哪段代碼把內(nèi)存的肚子搞大了....還是先看現(xiàn)象吧.
現(xiàn)象機(jī)器上還好有不少log, 長(zhǎng)長(zhǎng)的一串?dāng)?shù)據(jù)...暈啊都是告警, 要么high, 要么crtical...性能監(jiān)控居然沒有內(nèi)存和cpu采集....
暈了一天以后, 還沒解決問題. 再看log, 先看看告警和時(shí)間的關(guān)系吧:
一個(gè)告警是三行, 似乎不能直接進(jìn)excel畫圖. 還好告警之間是兩個(gè)\n, ultraedit, 替換兩個(gè)\n為特殊符號(hào), 然后替換一個(gè)\n為\t, 再把特殊符號(hào)替換成\n, 笨辦法, 湊合吧.
進(jìn)了excel, 很好, 畫三點(diǎn)圖, x為時(shí)間, 縱軸high為1, critial為2
曲線居然是長(zhǎng)城形狀的?!偶爾會(huì)有烽火臺(tái), 我k. 原來這么壯觀 .
數(shù)據(jù)太多, 曲線拉寬......無限寬以后, 遠(yuǎn)看長(zhǎng)城鋸鋸齒, 近看長(zhǎng)城....是幾個(gè)點(diǎn)!
越來越詭異了, 十分鐘一個(gè)城垛, 每個(gè)城垛大概6分鐘, 里面有大概6個(gè)點(diǎn)左右.
好了, 這個(gè)現(xiàn)象超級(jí)詭異, 再研究一下系統(tǒng)的內(nèi)存吧.
=============
內(nèi)存研究: jdk1.6現(xiàn)在帶了一個(gè)visual vm, java寫的, 配合數(shù)據(jù)采集工具, 能做內(nèi)存長(zhǎng)期監(jiān)控, 能做heap dump. 另外一個(gè)近親是netbeans, 功能非常類似. eclipse的tptp也能干這個(gè), 還有幾個(gè)商業(yè)軟件, 咱們就不盜版了. 因?yàn)樵趕olaris上面, tptp沒現(xiàn)成的可用.就visualvm吧, dump內(nèi)存發(fā)現(xiàn)很多意外的東西, 這個(gè)就不多說了, 時(shí)間長(zhǎng)了這些玩意還能被回收掉. 暫時(shí)忽略. 開始很多人都懷疑jvm內(nèi)存泄漏. 監(jiān)控了很久發(fā)現(xiàn)垃圾回收很正常, 空載的時(shí)候大概一個(gè)小時(shí)回收一次, 出現(xiàn)大鋸齒循環(huán). 貌似正常.
負(fù)載很重會(huì)怎樣? 鋸齒變陡峭, 很快就回收. 頻率在十幾分鐘吧. 怎樣? 聯(lián)想到什么?
=================
OK, 暫時(shí)猜測(cè), 負(fù)載重了就告警, jvm垃圾沒來得及回收告警就升級(jí).
好, 再鉆進(jìn)代碼垃圾中找找, 哦, 果然, 這個(gè)代碼很有趣, 如果剩余內(nèi)存少到一定比例, 開始log, 再高的話high告警, 再高就critical告警. 檢測(cè)周期大概一分鐘.
怎么修正? 這似乎是垃圾回收的正常行為. 那告訴jvm,你必須把內(nèi)存控制在多少以內(nèi)? jvm好像不鳥你. k, 這種內(nèi)存level告警也過于想當(dāng)然, java內(nèi)存用多少都有可能啊, 只要內(nèi)存沒超出, 最后正常收回去就完了嘛.
這里也不是完全絕望的, java7會(huì)有更好的垃圾回收機(jī)制, 說不定將來能用. 現(xiàn)在, 修改垃圾回收機(jī)制, 采用新一點(diǎn)的, 漸進(jìn)收集, 這個(gè)曲線出來就像一個(gè)大牛市, 里面有很多小震蕩, 逐步走高, 然后再來個(gè)大熊市...
另外, 該進(jìn)內(nèi)存檢測(cè), 提高最大內(nèi)存, 內(nèi)存在將要告警的時(shí)候強(qiáng)制回收一次. 加大負(fù)載后因?yàn)榭們?nèi)存已經(jīng)增加, 不會(huì)造成特別頻繁的垃圾回收.
OK, 睡覺了
還有點(diǎn)事情, 內(nèi)存里面的確有垃圾, 算了吧.有空再收拾. 成熟的產(chǎn)品有bug也不能亂修. 弄不好要影響已有客戶.
人世間最大的痛苦不是找不到問題, 也不是找到問題不會(huì)修正問題, 而是找到問題, 可以修正, 卻不能修正...
最新鮮的數(shù)據(jù), 正好在做sccs轉(zhuǎn)svn, 大概有8萬多次提交. 大概八年的項(xiàng)目.
庫有1G左右,都是代碼和代碼歷史..
這里記錄一些與恐龍共舞的經(jīng)驗(yàn), 不愉快的記憶最容易被遺忘, 還是記錄一下.
1. 內(nèi)存報(bào)警
這個(gè)報(bào)警是個(gè)老問題, 很多客戶都有這個(gè)問題, 是個(gè)老大難. 以前有人改過, 貌似沒用. 輪到我接手, 硬著頭皮上吧.
首先看代碼....暈....這個(gè)代碼風(fēng)格, 不, 應(yīng)該說整個(gè)項(xiàng)目都是, 文檔幾乎沒有了. 有也對(duì)不上, 在無數(shù)的改進(jìn)和bug fix以后幾乎慘不忍睹. 慘點(diǎn)還不算, 還不能format代碼, 因?yàn)榇a變化太大, diff出來沒法看. 這個(gè)不同的縮進(jìn), linux, windows, vim, eclipse下不同的工具下出來的代碼真是百花齊放. 后來我找到訣竅. format之后再還原.
代碼很暈, 誰知道哪段代碼把內(nèi)存的肚子搞大了....還是先看現(xiàn)象吧.
現(xiàn)象機(jī)器上還好有不少log, 長(zhǎng)長(zhǎng)的一串?dāng)?shù)據(jù)...暈啊都是告警, 要么high, 要么crtical...性能監(jiān)控居然沒有內(nèi)存和cpu采集....
暈了一天以后, 還沒解決問題. 再看log, 先看看告警和時(shí)間的關(guān)系吧:
一個(gè)告警是三行, 似乎不能直接進(jìn)excel畫圖. 還好告警之間是兩個(gè)\n, ultraedit, 替換兩個(gè)\n為特殊符號(hào), 然后替換一個(gè)\n為\t, 再把特殊符號(hào)替換成\n, 笨辦法, 湊合吧.
進(jìn)了excel, 很好, 畫三點(diǎn)圖, x為時(shí)間, 縱軸high為1, critial為2
曲線居然是長(zhǎng)城形狀的?!偶爾會(huì)有烽火臺(tái), 我k. 原來這么壯觀 .
數(shù)據(jù)太多, 曲線拉寬......無限寬以后, 遠(yuǎn)看長(zhǎng)城鋸鋸齒, 近看長(zhǎng)城....是幾個(gè)點(diǎn)!
越來越詭異了, 十分鐘一個(gè)城垛, 每個(gè)城垛大概6分鐘, 里面有大概6個(gè)點(diǎn)左右.
好了, 這個(gè)現(xiàn)象超級(jí)詭異, 再研究一下系統(tǒng)的內(nèi)存吧.
=============
內(nèi)存研究: jdk1.6現(xiàn)在帶了一個(gè)visual vm, java寫的, 配合數(shù)據(jù)采集工具, 能做內(nèi)存長(zhǎng)期監(jiān)控, 能做heap dump. 另外一個(gè)近親是netbeans, 功能非常類似. eclipse的tptp也能干這個(gè), 還有幾個(gè)商業(yè)軟件, 咱們就不盜版了. 因?yàn)樵趕olaris上面, tptp沒現(xiàn)成的可用.就visualvm吧, dump內(nèi)存發(fā)現(xiàn)很多意外的東西, 這個(gè)就不多說了, 時(shí)間長(zhǎng)了這些玩意還能被回收掉. 暫時(shí)忽略. 開始很多人都懷疑jvm內(nèi)存泄漏. 監(jiān)控了很久發(fā)現(xiàn)垃圾回收很正常, 空載的時(shí)候大概一個(gè)小時(shí)回收一次, 出現(xiàn)大鋸齒循環(huán). 貌似正常.
負(fù)載很重會(huì)怎樣? 鋸齒變陡峭, 很快就回收. 頻率在十幾分鐘吧. 怎樣? 聯(lián)想到什么?
=================
OK, 暫時(shí)猜測(cè), 負(fù)載重了就告警, jvm垃圾沒來得及回收告警就升級(jí).
好, 再鉆進(jìn)代碼垃圾中找找, 哦, 果然, 這個(gè)代碼很有趣, 如果剩余內(nèi)存少到一定比例, 開始log, 再高的話high告警, 再高就critical告警. 檢測(cè)周期大概一分鐘.
怎么修正? 這似乎是垃圾回收的正常行為. 那告訴jvm,你必須把內(nèi)存控制在多少以內(nèi)? jvm好像不鳥你. k, 這種內(nèi)存level告警也過于想當(dāng)然, java內(nèi)存用多少都有可能啊, 只要內(nèi)存沒超出, 最后正常收回去就完了嘛.
這里也不是完全絕望的, java7會(huì)有更好的垃圾回收機(jī)制, 說不定將來能用. 現(xiàn)在, 修改垃圾回收機(jī)制, 采用新一點(diǎn)的, 漸進(jìn)收集, 這個(gè)曲線出來就像一個(gè)大牛市, 里面有很多小震蕩, 逐步走高, 然后再來個(gè)大熊市...
另外, 該進(jìn)內(nèi)存檢測(cè), 提高最大內(nèi)存, 內(nèi)存在將要告警的時(shí)候強(qiáng)制回收一次. 加大負(fù)載后因?yàn)榭們?nèi)存已經(jīng)增加, 不會(huì)造成特別頻繁的垃圾回收.
OK, 睡覺了
還有點(diǎn)事情, 內(nèi)存里面的確有垃圾, 算了吧.有空再收拾. 成熟的產(chǎn)品有bug也不能亂修. 弄不好要影響已有客戶.
人世間最大的痛苦不是找不到問題, 也不是找到問題不會(huì)修正問題, 而是找到問題, 可以修正, 卻不能修正...
總結(jié)
以上是生活随笔為你收集整理的与恐龙共舞 1. 内存报警的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: T70次列车(乌鲁木齐 到 北京)的列车
- 下一篇: 例说游戏角色设计与角色文化内涵的关系