亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java OOM原因以及解決方案

 更新時間:2021年09月02日 10:40:54   作者:Qi_Meng6  
這篇文章主要介紹了Java OOM原因以及解決方案,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下

1)什么是OOM? OOM,全稱“Out Of Memory”,翻譯成中文就是“內(nèi)存用完了”,來源于java.lang.OutOfMemoryError。看下關(guān)于的官方說明: Thrown when the Java Virtual Machine cannot allocate an object because it is out of memory, and no more memory could be made available by the garbage collector. 意思就是說,當JVM因為沒有足夠的內(nèi)存來為對象分配空間并且垃圾回收器也已經(jīng)沒有空間可回收時,就會拋出這個error(注:非exception,因為這個問題已經(jīng)嚴重到不足以被應(yīng)用處理)。

2)為什么會OOM?

為什么會沒有內(nèi)存了呢?原因不外乎有兩點:

1)分配的少了:比如虛擬機本身可使用的內(nèi)存(一般通過啟動時的VM參數(shù)指定)太少。

2)應(yīng)用用的太多,并且用完沒釋放,浪費了。此時就會造成內(nèi)存泄露或者內(nèi)存溢出。

內(nèi)存泄露:申請使用完的內(nèi)存沒有釋放,導(dǎo)致虛擬機不能再次使用該內(nèi)存,此時這段內(nèi)存就泄露了,因為申請者不用了,而又不能被虛擬機分配給別人用。

內(nèi)存溢出:申請的內(nèi)存超出了JVM能提供的內(nèi)存大小,此時稱之為溢出。

在之前沒有垃圾自動回收的日子里,比如C語言和C++語言,我們必須親自負責內(nèi)存的申請與釋放操作,如果申請了內(nèi)存,用完后又忘記了釋放,比如C++中的new了但是沒有delete,那么就可能造成內(nèi)存泄露。偶爾的內(nèi)存泄露可能不會造成問題,而大量的內(nèi)存泄露可能會導(dǎo)致內(nèi)存溢出。

而在Java語言中,由于存在了垃圾自動回收機制,所以,我們一般不用去主動釋放不用的對象所占的內(nèi)存,也就是理論上來說,是不會存在“內(nèi)存泄露”的。但是,如果編碼不當,比如,將某個對象的引用放到了全局的Map中,雖然方法結(jié)束了,但是由于垃圾回收器會根據(jù)對象的引用情況來回收內(nèi)存,導(dǎo)致該對象不能被及時的回收。如果該種情況出現(xiàn)次數(shù)多了,就會導(dǎo)致內(nèi)存溢出,比如系統(tǒng)中經(jīng)常使用的緩存機制。Java中的內(nèi)存泄露,不同于C++中的忘了delete,往往是邏輯上的原因泄露。

3)OOM的類型

JVM內(nèi)存模型:

按照JVM規(guī)范,JAVA虛擬機在運行時會管理以下的內(nèi)存區(qū)域:

  • 程序計數(shù)器:當前線程執(zhí)行的字節(jié)碼的行號指示器,線程私有
  • JAVA虛擬機棧:Java方法執(zhí)行的內(nèi)存模型,每個Java方法的執(zhí)行對應(yīng)著一個棧幀的進棧和出棧的操作。
  • 本地方法棧:類似“ JAVA虛擬機棧 ”,但是為native方法的運行提供內(nèi)存環(huán)境。
  • JAVA堆:對象內(nèi)存分配的地方,內(nèi)存垃圾回收的主要區(qū)域,所有線程共享??煞譃樾律仙?。
  • 方法區(qū):用于存儲已經(jīng)被JVM加載的類信息、常量、靜態(tài)變量、即時編譯器編譯后的代碼等數(shù)據(jù)。Hotspot中的“永久代”。
  • 運行時常量池:方法區(qū)的一部分,存儲常量信息,如各種字面量、符號引用等。
  • 直接內(nèi)存:并不是JVM運行時數(shù)據(jù)區(qū)的一部分, 可直接訪問的內(nèi)存, 比如NIO會用到這部分。

按照JVM規(guī)范,除了程序計數(shù)器不會拋出OOM外,其他各個內(nèi)存區(qū)域都可能會拋出OOM。

最常見的OOM情況有以下三種:

  • java.lang.OutOfMemoryError: Java heap space ------>java堆內(nèi)存溢出,此種情況最常見,一般由于內(nèi)存泄露或者堆的大小設(shè)置不當引起。對于內(nèi)存泄露,需要通過內(nèi)存監(jiān)控軟件查找程序中的泄露代碼,而堆大小可以通過虛擬機參數(shù)-Xms,-Xmx等修改。
  • java.lang.OutOfMemoryError: PermGen space ------>java永久代溢出,即方法區(qū)溢出了,一般出現(xiàn)于大量Class或者jsp頁面,或者采用cglib等反射機制的情況,因為上述情況會產(chǎn)生大量的Class信息存儲于方法區(qū)。此種情況可以通過更改方法區(qū)的大小來解決,使用類似-XX:PermSize=64m -XX:MaxPermSize=256m的形式修改。另外,過多的常量尤其是字符串也會導(dǎo)致方法區(qū)溢出。
  • java.lang.StackOverflowError ------> 不會拋OOM error,但也是比較常見的Java內(nèi)存溢出。JAVA虛擬機棧溢出,一般是由于程序中存在死循環(huán)或者深度遞歸調(diào)用造成的,棧大小設(shè)置太小也會出現(xiàn)此種溢出。可以通過虛擬機參數(shù)-Xss來設(shè)置棧的大小。

4)OOM分析--heapdump

要dump堆的內(nèi)存鏡像,可以采用如下兩種方式:

  • 設(shè)置JVM參數(shù)-XX:+HeapDumpOnOutOfMemoryError,設(shè)定當發(fā)生OOM時自動dump出堆信息。不過該方法需要JDK5以上版本。
  • 使用JDK自帶的jmap命令。"jmap -dump:format=b,file=heap.bin <pid>"   其中pid可以通過jps獲取。

dump堆內(nèi)存信息后,需要對dump出的文件進行分析,從而找到OOM的原因。常用的工具有:

  • mat: eclipse memory analyzer, 基于eclipse RCP的內(nèi)存分析工具。詳細信息參見:http://www.eclipse.org/mat/,推薦使用。
  • jhat:JDK自帶的java heap analyze tool,可以將堆中的對象以html的形式顯示出來,包括對象的數(shù)量,大小等等,并支持對象查詢語言O(shè)QL,分析相關(guān)的應(yīng)用后,可以通過http://localhost:7000來訪問分析結(jié)果。不推薦使用,因為在實際的排查過程中,一般是先在生產(chǎn)環(huán)境 dump出文件來,然后拉到自己的開發(fā)機器上分析,所以,不如采用高級的分析工具比如前面的mat來的高效。

這個鏈接:https://developer.ibm.com/alert-zh/中提供了一個采用mat分析的例子 。

注意:因為JVM規(guī)范沒有對dump出的文件的格式進行定義,所以不同的虛擬機產(chǎn)生的dump文件并不是一樣的。在分析時,需要針對不同的虛擬機的輸出采用不同的分析工具(當然,有的工具可以兼容多個虛擬機的格式)。IBM HeapAnalyzer也是分析heap的一個常用的工具。

到此這篇關(guān)于Java OOM原因以及解決方案的文章就介紹到這了,更多相關(guān)Java OOM內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java如何導(dǎo)入Jsoup庫做一個有趣的爬蟲項目

    Java如何導(dǎo)入Jsoup庫做一個有趣的爬蟲項目

    Jsoup庫是一款Java的HTML解析器,可用于從網(wǎng)絡(luò)或本地文件中獲取HTML文檔并解析其中的數(shù)據(jù),這篇文章給大家介紹Java導(dǎo)入Jsoup庫做一個有趣的爬蟲項目,感興趣的朋友跟隨小編一起看看吧
    2023-11-11
  • IDEA安裝Activiti插件并解決亂碼問題(推薦)

    IDEA安裝Activiti插件并解決亂碼問題(推薦)

    這篇文章主要介紹了IDEA安裝Activiti插件并解決亂碼問題,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • java實現(xiàn)文件切片上傳百度云+斷點續(xù)傳的方法

    java實現(xiàn)文件切片上傳百度云+斷點續(xù)傳的方法

    文件續(xù)傳在很多地方都可以用的到,本文主要介紹了java實現(xiàn)文件切片上傳百度云+斷點續(xù)傳的方法,?文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • 零基礎(chǔ)寫Java知乎爬蟲之進階篇

    零基礎(chǔ)寫Java知乎爬蟲之進階篇

    前面幾篇文章,我們都是簡單的實現(xiàn)了java爬蟲抓取內(nèi)容的問題,那么如果遇到復(fù)雜情況,我們還能繼續(xù)那么做嗎?答案當然是否定的,之前的僅僅是入門篇,都是些基礎(chǔ)知識,給大家練手用的,本文我們就來點高大上的東西
    2014-11-11
  • Java調(diào)用接口如何獲取json數(shù)據(jù)解析后保存到數(shù)據(jù)庫

    Java調(diào)用接口如何獲取json數(shù)據(jù)解析后保存到數(shù)據(jù)庫

    這篇文章主要介紹了Java調(diào)用接口如何獲取json數(shù)據(jù)解析后保存到數(shù)據(jù)庫問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • IDEA解決Java:程序包xxxx不存在的問題

    IDEA解決Java:程序包xxxx不存在的問題

    這篇文章主要介紹了IDEA解決Java:程序包xxxx不存在的問題,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • Java獲取服務(wù)器IP及端口的方法實例分析

    Java獲取服務(wù)器IP及端口的方法實例分析

    這篇文章主要介紹了Java獲取服務(wù)器IP及端口的方法,結(jié)合實例形式分析了java針對客戶端及服務(wù)器端各種常見的信息操作技巧與注意事項,需要的朋友可以參考下
    2018-12-12
  • Java中調(diào)用Python的實現(xiàn)示例

    Java中調(diào)用Python的實現(xiàn)示例

    本文主要介紹了Java中調(diào)用Python的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • 深入了解Java接口回調(diào)機制

    深入了解Java接口回調(diào)機制

    這篇文章主要介紹了Java接口回調(diào)機制,下面我們來一起學(xué)習(xí)一下吧
    2019-05-05
  • Java動態(tài)代理四種實現(xiàn)方式詳解

    Java動態(tài)代理四種實現(xiàn)方式詳解

    這篇文章主要介紹了Java四種動態(tài)代理實現(xiàn)方式,對于開始學(xué)習(xí)java動態(tài)代理或者要復(fù)習(xí)java動態(tài)代理的朋友來講很有參考價值,有感興趣的朋友可以參考一下
    2021-04-04

最新評論