<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    紫風亂寫

    除了他眼前的屏幕,這個人什么也沒看見。
    被周圍的電腦簇擁著,他只知道他所創(chuàng)造的現(xiàn)實,但又意識到那是虛幻。
    他已經超越了技術。也超越了機器。
    posts - 62, comments - 93, trackbacks - 0, articles - 0
      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    病中吟之內存溢出

    Posted on 2015-06-08 19:13 Justfly Shi 閱讀(3982) 評論(4)  編輯  收藏 所屬分類: 隨便寫寫

    感冒了,在家里休息,打開電腦隨便看看,想起前兩天有人問的一個事情:“內存溢出怎么分析和處理?”方案有很多了,基本上的思路就是獲取系統(tǒng)狀態(tài),內存變化方向,內存對象等之類的,profile,debug,jmx,dump等等。

    我更想說的是,為什么會內存溢出呢?

    在我看來,干活有兩種方式:

    • 沒想清楚了,貿貿然開干,然后各處救火各種解決問題
    • 想清楚了再開干,無驚無險,安然做完

    一般來說,我都是后者,所以真的很少碰到各種莫名其妙的問題,比如自己實現(xiàn)排序算法、在內存中處理有100000個值的列表、不用第三個變量來交換兩個變量的值等等。

    怎么避免內存溢出

    吐槽完畢,來說說對于內存溢出這種事情是要怎么避免,我所謂的“想清楚了再開干”到底是怎么想清楚的。

    首先內存溢出的本質是什么?“內存使用超出了預期”。 
    那么要怎么避免呢?“預期內存怎么使用,將其控制在內存使用范圍呢”。

    如何預期內存的使用

    Java程序中,內存是被怎么占用的?被數(shù)據(jù)和對象占用的,數(shù)據(jù)和對象怎么來的?

    • 應用的輸入和輸出
    • 第三方系統(tǒng)的輸入和輸出
    • 應用本身產生的數(shù)據(jù)

    如何控制內存的使用

    應用輸入和輸出怎么控制

    • 控制允許輸入的線程數(shù),比如允許同時多少個線程提供服務
    • 控制輸入的請求對象的大小和內容,比如輸入時的所允許的緩沖區(qū)大小
    • 輸出的線程數(shù)是和輸入的線程對應的,如果是主動輸出的,那么就控制一下
    • 輸出的服務對象的大小和內容,比如你是文件服務器,那么設置一個輸出緩存,每10K就Flush一下。

    第三方系統(tǒng)的輸入和輸出怎么控制

    思路和應用輸入和輸出怎么控制所說的是一樣的,控制線程數(shù),使用緩存控制。

    應用本身產生的數(shù)據(jù)怎么控制

    思路也是一樣的,線程數(shù),緩存,再加上生存時間,對象池等等。

    還有?

    使用上述技巧和思路你就能控制好你應用中的內存了,但是所有的設計都是在風險和滿足需求之間的平衡,如果再退一步,那么你需要考慮一下Java虛擬機中內存各個區(qū)的使用了。你需要區(qū)分好哪些是常駐對象,哪些是臨時對象,新生代,舊生代,怎么安排你的虛擬機中各個內存區(qū)的大小。希望你不需要用到,如果需要的話,可以看看《深入理解Java虛擬機》這本書。

    來個例子

    有這么一個應用,它獲取客戶端的請求,驗證請求的合法性,然后對于合法的請求,從第三方系統(tǒng)獲取文件內容,并把文件內容寫回給客戶端。 
    下面是一大片的空白,再滾動下去之前看我的設計之前,讀者可以就這個需求想想你會怎么處理。 







































    |

    應用本身的的輸入和輸出的控制

    • 同時服務數(shù)設置為可配置的屬性,來控制并行的服務數(shù)
    • 請求只允許Get請求,請求內容只有Header和URL,設置一個輸入Buffer
    • 輸出,設置輸出緩存區(qū)的大小,可配置的,默認情況下,每20K Flush一下。

    第三方系統(tǒng)的輸入和輸出

    第三方系統(tǒng)有兩個,一個是合法性驗證的,一個是文件內容的。 
    合法性驗證的請求和輸出的內容都比較小。但是考慮到其服務器的性能,把合法性驗證的交互過程放到一個線程池中控制。這樣能避免合法性驗證服務不過來的情況。

    文件內容第三方系統(tǒng)的輸入和輸出的控制

    • 和合法性驗證一樣,文件內容第三方系統(tǒng)的輸入和輸出能力有限,將其訪問用線程池控制起來。
    • 文件內容第三方系統(tǒng)的請求訪問對象較小,不予控制
    • 整個系統(tǒng)的最重點來了!文件內容第三方系統(tǒng)的返回文件大小不可控制。所以使用緩存機制,每次讀入20K(可配置),然后寫給系統(tǒng)的客戶端,然后再讀20K,然后再寫,讓文件內容從這個系統(tǒng)中像水一樣流過去。流不動了(第三方系統(tǒng)連接或者客戶端連接失敗)就讓本次服務失敗。這個流過去就是重點了,不管這個文件多大,每次請求只占用20K。

    應用本身產生的數(shù)據(jù)

    最原始的需求中還有一個把文件內容緩存在本地,然后可以多次寫給客戶端的這么一個想法,減少網絡等待。這個想法被我否決了,原因如下:

    • 首先可以通過HTTP 304狀態(tài)碼來減少同一客戶端對同樣內容的多次讀取。
    • 如果不對這個文件內容進行管理,將導致硬盤空間溢出。如果對其管理,會添加很多的開發(fā)、運維和設計的工作,得不償失。

    總結

    想清楚了再開干就是這個意思,花點時間系統(tǒng)的想想,想清楚了,前面多寫點代碼,多寫點單元測試,后面少點麻煩,不用救火,也不用加班。 
    吃飯去了。

    再多啰嗦一句,《JUnit收費課程》的第二節(jié)的材料已經準備好了,昨晚擔心自己的塞著鼻子,大家聽著難受,沒有錄。今天好多了,晚上錄一下,明天上午編輯審核,明天下午或者晚上大家應該就能看到了。


    評論

    # re: 病中吟之內存溢出  回復  更多評論   

    2015-06-16 10:50 by imxylz
    有興趣加入世界邦么?http://www.tkk7.com/xylz/archive/2013/11/05/406019.html

    # re: 病中吟之內存溢出  回復  更多評論   

    2015-06-16 21:52 by Justfly Shi
    @imxylz
    謝謝,可惜我目前不在北京。

    # re: 病中吟之內存溢出  回復  更多評論   

    2015-06-29 12:16 by 好介紹
    對內容溢出的介紹很不錯!

    # re: 病中吟之內存溢出  回復  更多評論   

    2015-08-12 11:33 by 東莞服務器租用
    話說中間留那么大一空白是啥意思?
    主站蜘蛛池模板: 亚洲风情亚Aⅴ在线发布| 91嫩草私人成人亚洲影院| 亚洲精品色播一区二区| 成人免费一级毛片在线播放视频| 亚洲国产精品无码久久久蜜芽 | 久久久久无码专区亚洲av| 美女被免费视频网站| 四虎永久成人免费影院域名| 国产亚洲高清在线精品不卡| 国产免费私拍一区二区三区| 色屁屁在线观看视频免费| 亚洲人AV永久一区二区三区久久| 一级做a爱过程免费视| 亚洲精品国产品国语在线| 88av免费观看| 亚洲an日韩专区在线| 午夜精品在线免费观看| 特级av毛片免费观看| 亚洲中文字幕无码久久精品1| 亚洲免费观看视频| 亚洲va乱码一区二区三区| 日本黄色免费观看| 三上悠亚电影全集免费| 亚洲国产天堂在线观看| 毛片基地免费视频a| 男男黄GAY片免费网站WWW| 国产AV无码专区亚洲AV手机麻豆| 在线观看片免费人成视频无码| 亚洲精品无码久久毛片波多野吉衣 | 亚洲一级高清在线中文字幕| 午夜毛片不卡高清免费| a一级爱做片免费| 亚洲高清视频免费| 黄a大片av永久免费| 免费精品久久天干天干| 亚洲一区在线视频| 亚洲日韩中文在线精品第一| 久久综合给合久久国产免费| 欧洲亚洲国产精华液| 久久久综合亚洲色一区二区三区| 成人毛片免费视频|