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

Java OOM原因以及解決方案

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

1)什么是OOM OOM,全稱“Out Of Memory”,翻譯成中文就是“內(nèi)存用完了”,來(lái)源于java.lang.OutOfMemoryError??聪玛P(guān)于的官方說(shuō)明: 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. 意思就是說(shuō),當(dāng)JVM因?yàn)闆]有足夠的內(nèi)存來(lái)為對(duì)象分配空間并且垃圾回收器也已經(jīng)沒有空間可回收時(shí),就會(huì)拋出這個(gè)error(注:非exception,因?yàn)檫@個(gè)問題已經(jīng)嚴(yán)重到不足以被應(yīng)用處理)。

2)為什么會(huì)OOM?

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

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

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

內(nèi)存泄露:申請(qǐng)使用完的內(nèi)存沒有釋放,導(dǎo)致虛擬機(jī)不能再次使用該內(nèi)存,此時(shí)這段內(nèi)存就泄露了,因?yàn)樯暾?qǐng)者不用了,而又不能被虛擬機(jī)分配給別人用。

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

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

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

3)OOM的類型

JVM內(nèi)存模型:

按照J(rèn)VM規(guī)范,JAVA虛擬機(jī)在運(yùn)行時(shí)會(huì)管理以下的內(nèi)存區(qū)域:

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

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

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

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

4)OOM分析--heapdump

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

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

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

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

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

注意:因?yàn)镴VM規(guī)范沒有對(duì)dump出的文件的格式進(jìn)行定義,所以不同的虛擬機(jī)產(chǎn)生的dump文件并不是一樣的。在分析時(shí),需要針對(duì)不同的虛擬機(jī)的輸出采用不同的分析工具(當(dāng)然,有的工具可以兼容多個(gè)虛擬機(jī)的格式)。IBM HeapAnalyzer也是分析heap的一個(gè)常用的工具。

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

相關(guān)文章

  • java 如何遠(yuǎn)程控制tomcat啟動(dòng)關(guān)機(jī)

    java 如何遠(yuǎn)程控制tomcat啟動(dòng)關(guān)機(jī)

    這篇文章主要介紹了java 遠(yuǎn)程控制tomcat啟動(dòng)關(guān)機(jī)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04
  • Redisson分布式鎖源碼解析

    Redisson分布式鎖源碼解析

    文章給大家分享了關(guān)于Redisson分布式鎖源碼相關(guān)的知識(shí)點(diǎn)內(nèi)容,有興趣的朋友們可以參考學(xué)習(xí)下。
    2018-08-08
  • Java實(shí)現(xiàn)的兩個(gè)線程同時(shí)運(yùn)行案例

    Java實(shí)現(xiàn)的兩個(gè)線程同時(shí)運(yùn)行案例

    這篇文章主要介紹了Java實(shí)現(xiàn)的兩個(gè)線程同時(shí)運(yùn)行,涉及java多線程相關(guān)操作與使用技巧,需要的朋友可以參考下
    2019-07-07
  • Java中Map集合的常用方法詳解

    Java中Map集合的常用方法詳解

    本篇文章給大家?guī)?lái)的內(nèi)容是關(guān)于Java中Map集合的常用方法詳解,有一定的參考價(jià)值,有需要的朋友可以參考一下,希望對(duì)你有所幫助。下面我們就來(lái)學(xué)習(xí)一下吧
    2021-11-11
  • SpringBoot開發(fā)案例之打造私有云網(wǎng)盤的實(shí)現(xiàn)

    SpringBoot開發(fā)案例之打造私有云網(wǎng)盤的實(shí)現(xiàn)

    這篇文章主要介紹了SpringBoot開發(fā)案例之打造私有云網(wǎng)盤的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 使用SpringBoot實(shí)現(xiàn)微服務(wù)超時(shí)重試模式的示例

    使用SpringBoot實(shí)現(xiàn)微服務(wù)超時(shí)重試模式的示例

    這篇文章主要介紹了使用SpringBoot實(shí)現(xiàn)微服務(wù)超時(shí)重試模式的示例,幫助大家更好的理解和使用springboot框架,感興趣的朋友可以了解下
    2020-11-11
  • 如何解決Mybatis--java.lang.IllegalArgumentException: Result Maps collection already contains value for X

    如何解決Mybatis--java.lang.IllegalArgumentException: Result Maps

    這兩天因?yàn)轫?xiàng)目需要整合spring、struts2、mybatis三大框架,但啟動(dòng)的時(shí)候總出現(xiàn)這個(gè)錯(cuò)誤,困擾我好久,折騰了好久終于找到問題根源,下面小編給大家分享下問題所在及解決辦法,一起看看吧
    2016-12-12
  • 詳解Java中JSON數(shù)據(jù)的生成與解析

    詳解Java中JSON數(shù)據(jù)的生成與解析

    今天給大家?guī)?lái)的是關(guān)于Java的相關(guān)知識(shí),文章圍繞著Java中JSON數(shù)據(jù)的生成與解析展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • 詳細(xì)分析Java中String、StringBuffer、StringBuilder類的性能

    詳細(xì)分析Java中String、StringBuffer、StringBuilder類的性能

    在Java中,String類和StringBuffer類以及StringBuilder類都能用于創(chuàng)建字符串對(duì)象,而在分別操作這些對(duì)象時(shí)我們會(huì)發(fā)現(xiàn)JVM執(zhí)行它們的性能并不相同,下面我們就來(lái)詳細(xì)分析Java中String、StringBuffer、StringBuilder類的性能
    2016-05-05
  • Spring ApplicationListener監(jiān)聽器用法詳解

    Spring ApplicationListener監(jiān)聽器用法詳解

    這篇文章主要介紹了Spring ApplicationListener監(jiān)聽器用法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11

最新評(píng)論