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

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

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

    放翁(文初)的一畝三分地

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      210 隨筆 :: 1 文章 :: 320 評論 :: 0 Trackbacks
           OOM這個(gè)縮寫就是Java程序開發(fā)過程中讓人最頭痛的問題:Out of Memory。在很多開發(fā)人員的開發(fā)過程中,或多或少的都會遇到這類問題,這類問題定位比較困難,往往需要根據(jù)經(jīng)驗(yàn)來判斷可能出現(xiàn)問題的代碼。原因主要是兩個(gè):對象沒有被釋放(多種情況引起,往往是比較隱蔽的引用導(dǎo)致被Hold而無法被回收)。另一種就是真的Memory不夠用了,需要增加JVMHeap來滿足應(yīng)用程序的需求。最近有同事發(fā)的關(guān)于解決OOM的問題,讓我了解了原來OOM除了在JVM Heap不夠時(shí)會發(fā)生,在Native Heap不夠的時(shí)候也會發(fā)生,同時(shí)JVM HeapNative Heap存在著相互影響和平衡的關(guān)系,因此就仔細(xì)的去看了關(guān)于OOMJVM配置優(yōu)化的內(nèi)容。

    OOM

           在其他語言類似于C,Delphi等等由于內(nèi)存都是由自己分配和管理,因此內(nèi)存泄露的問題比較常見,同時(shí)也是很頭痛的一件事情。而Java的對象生命周期管理都是JVM來做的,簡化了開發(fā)人員的非業(yè)務(wù)邏輯的處理,但是這種自動(dòng)管理回收機(jī)制也是基于一些規(guī)則的,而違背了這些規(guī)則的時(shí)候,就會造成所謂的“Memory Leak”。

    OOM(Java Heap)

           錯(cuò)誤提示:java.lang.OutOfMemoryError

    這類OOM是由于JVM分配的給應(yīng)用的Heap Memory已經(jīng)被耗盡,可能是因?yàn)閼?yīng)用在高負(fù)荷的情況下的卻需要很大的內(nèi)存,因此可以通過修改JVM參數(shù)來增加Java Heap Memory(不過也不能無限制增加,后面那種OOM有可能就是因?yàn)檫@個(gè)原因而產(chǎn)生)。另一種情況是因?yàn)閼?yīng)用程序使用對象或者資源沒有釋放,導(dǎo)致內(nèi)存消耗持續(xù)增加,最后出現(xiàn)OOM,這類問題引起的原因往往是應(yīng)用已不需要的對象還被其他有效對象所引用,那么就無法釋放,可能是業(yè)務(wù)代碼邏輯造成的(異常處理不夠例如IO等資源),也可能是對于第三方開源項(xiàng)目中資源釋放了解不夠?qū)е率褂靡院筚Y源沒有釋放(例如JDBCResultSet等)。

           幾個(gè)容易出現(xiàn)問題的場景:

           1.應(yīng)用的緩存或者Collection:如果應(yīng)用要緩存Java對象或者是在一個(gè)Collection中保存對象,那么就要確定是否會有大量的對象存入,要做保護(hù),以防止在大數(shù)據(jù)量下大量內(nèi)存被消耗,同時(shí)要保證Cache的大小不會無限制增加。

           2.生命周期較長的對象:盡量簡短對象的生命周期,現(xiàn)在采用對象的創(chuàng)建釋放代價(jià)已經(jīng)很低,同時(shí)作了很好的優(yōu)化,要比創(chuàng)建一個(gè)對象長期反復(fù)使用要好。如果能夠設(shè)置超時(shí)的情景下,盡量設(shè)置超時(shí)。

           3.類似于JDBCConnection Pool,在使用Pool中的對象以后需要釋放并返回,不然就會造成Pool的不斷增大,在其他Pool中使用也是一樣。同樣ResultSetIO這類資源的釋放都需要注意。

           解決的方法就是查找錯(cuò)誤或者是增加Java Heap Memory。對于此類問題檢測工具相當(dāng)多,這里就不做介紹了。      

    OOM(Native Heap)

    錯(cuò)誤提示:requested XXXX bytes for ChunkPool::allocate. Out of swap space

           Native Heap MemoryJVM內(nèi)部使用的Memory,這部分的Memory可以通過JDK提供的JNI的方式去訪問,這部分Memory效率很高,但是管理需要自己去做,如果沒有把握最好不要使用,以防出現(xiàn)內(nèi)存泄露問題。JVM 使用Native Heap Memory用來優(yōu)化代碼載入(JTI代碼生成),臨時(shí)對象空間申請,以及JVM內(nèi)部的一些操作。這次同事在壓力測試中遇到的問題就是這類OOM,也就是這類Memory耗盡。同樣這類OOM產(chǎn)生的問題也是分成正常使用耗盡和無釋放資源耗盡兩類。無釋放資源耗盡很多時(shí)候不是程序員自身的原因,可能是引用的第三方包的缺陷,例如很多人遇到的Oracle 9 JDBC驅(qū)動(dòng)在低版本中有內(nèi)存泄露的問題。要確定這類問題,就需要去觀察Native Heap Memory的增長和使用情況,在服務(wù)器應(yīng)用起來以后,運(yùn)行一段時(shí)間后JVM對于Native Heap Memory的使用會達(dá)到一個(gè)穩(wěn)定的階段,此時(shí)可以看看什么操作對于Native Heap Memory操作頻繁,而且使得Native Heap Memory增長,對于Native Heap Memory的情況我還沒有找到辦法去檢測,現(xiàn)在能夠看到的就是為JVM啟動(dòng)時(shí)候增加-verbose:jni參數(shù)來觀察對于Native Heap Memory的操作。另一種情況就是正常消耗Native Heap Memory,對于Native Heap Memory的使用主要取決于JVM代碼生成,線程創(chuàng)建,用于優(yōu)化的臨時(shí)代碼和對象產(chǎn)生。當(dāng)正常耗盡Native Heap Memory時(shí),那么就需要增加Native Heap Memory,此時(shí)就會和我們前面提到增加java Heap Memory的情況出現(xiàn)矛盾。

    應(yīng)用內(nèi)存組合

           對于應(yīng)用來說,可分配的內(nèi)存受到OS的限制,不同的OS對進(jìn)程所能訪問虛擬內(nèi)存地址區(qū)間直接影響對于應(yīng)用內(nèi)存的分配,32位的操作系統(tǒng)通常最大支持4G的內(nèi)存尋址,而Linux一般為3GWindows2G。然而這些大小的內(nèi)存并不會全部給JVMJava Heap使用,它主要會分成三部分:Java HeapNative Heap,載入資源和類庫等所占用的內(nèi)存。那么由此可見,Native Heap Java Heap大小配置是相互制約的,哪一部分分配多了都可能會影響到另外一部分的正常工作,因此如果通過命令行去配置,那么需要確切的了解應(yīng)用使用情況,否則采用默認(rèn)配置自動(dòng)監(jiān)測會更好的優(yōu)化應(yīng)用使用情況。

           同樣要注意的就是進(jìn)程的虛擬內(nèi)存和機(jī)器的實(shí)際內(nèi)存還是有區(qū)別的,對于機(jī)器來說實(shí)際內(nèi)存以及硬盤提供的虛擬內(nèi)存都是提供給機(jī)器上所有進(jìn)程使用的,因此在設(shè)置JVM參數(shù)時(shí),它的虛擬內(nèi)存絕對不應(yīng)該超過實(shí)際內(nèi)存的大小。

    待續(xù)……


    JVM
    優(yōu)化配置


    更多內(nèi)容可訪問:http://blog.csdn.net/cenwenchu79/
    posted on 2008-01-22 16:54 岑文初 閱讀(2826) 評論(2)  編輯  收藏

    評論

    # re: OOM和JVM配置優(yōu)化 2008-01-24 10:36 lx281
    謝謝lz的文章,我也碰到過這樣的oom的問題,不過暫時(shí)沒有做什么優(yōu)化,僅僅是增加了jvm的空間,繼續(xù)學(xué)習(xí)下如何優(yōu)化  回復(fù)  更多評論
      

    # re: OOM和JVM配置優(yōu)化 2009-07-11 09:02 二胡
    SoftReference & WeakReference ,內(nèi)存不足的時(shí)候,GC會回收相關(guān)對象.

    好文,轉(zhuǎn)走了!  回復(fù)  更多評論
      


    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 久久精品国产亚洲AV未满十八| 久久精品国产亚洲av水果派| 亚洲av日韩av永久无码电影| 成人人观看的免费毛片| 亚洲精品国产精品国自产网站 | 暖暖免费在线中文日本| 国产亚洲精品a在线观看app | 欧亚一级毛片免费看| 亚洲国产精品综合久久网络| 亚洲精品黄色视频在线观看免费资源 | 亚洲s码欧洲m码吹潮| 大学生美女毛片免费视频| 亚洲一久久久久久久久| 四虎影视永久免费视频观看| 国产精品免费看久久久| 精品无码一区二区三区亚洲桃色 | 日本亚洲高清乱码中文在线观看| 亚洲?V乱码久久精品蜜桃| 三级黄色在线免费观看| 日产亚洲一区二区三区| 毛片免费视频在线观看| 美女被爆羞羞网站免费| 亚洲精品乱码久久久久久按摩 | 久久国产乱子免费精品| 91丁香亚洲综合社区| 免费人成视网站在线观看不卡 | 97免费人妻无码视频| 老妇激情毛片免费| 亚洲av色影在线| 午夜a级成人免费毛片| 精品乱子伦一区二区三区高清免费播放 | 日韩免费一级毛片| 永久免费A∨片在线观看| 国产成人精品日本亚洲18图| 亚洲欧洲自拍拍偷精品 美利坚| 免费91麻豆精品国产自产在线观看| 亚洲人6666成人观看| 亚洲欧洲精品成人久久奇米网 | 情人伊人久久综合亚洲| WWW国产亚洲精品久久麻豆| 国产AV无码专区亚洲AVJULIA|