最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java虛擬機(jī)常見內(nèi)存溢出錯(cuò)誤匯總

 更新時(shí)間:2020年09月12日 15:16:19   作者:RedMushroom  
這篇文章主要匯總了Java虛擬機(jī)常見的內(nèi)存溢出錯(cuò)誤,警示大家,避免出錯(cuò),感興趣的朋友可以了解下

一、引言

從事java開發(fā)的小伙伴在平時(shí)的開發(fā)工作中,應(yīng)該會(huì)遇見各式各樣的異常和錯(cuò)誤,在實(shí)際工作中積累的異?;蛘咤e(cuò)誤越多,趟過(guò)的坑越多,就會(huì)使我們編碼更加的健壯,就會(huì)本能地避開很多嚴(yán)重的坑。以下介紹幾個(gè)Java虛擬機(jī)常見內(nèi)存溢出錯(cuò)誤。以此警示,避免生產(chǎn)血案。

二、模擬Java虛擬機(jī)常見內(nèi)存溢出錯(cuò)誤

1、內(nèi)存溢出之棧溢出錯(cuò)誤

package com.jayway.oom; 
 
/** 
 * 棧溢出錯(cuò)誤 
 * 虛擬機(jī)參數(shù):-Xms10m -Xmx10m 
 * 拋出異常:Exception in thread "main" java.lang.StackOverflowError 
 */
 public class StackOverflowErrorDemo { 
 
 public static void main(String[] args) { 
  stackOverflowError(); 
 } 
 
 private static void stackOverflowError() { 
  stackOverflowError(); 
 } 
 
}

2、內(nèi)存溢出之堆溢出錯(cuò)誤

package com.jayway.oom; 
 
import java.util.Random; 
 
/** 
 * 堆溢出錯(cuò)誤 
 * 虛擬機(jī)參數(shù):-Xmx10m -Xms10m
 * 拋出異常:Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 
 */
 public class JavaHeapSpaceErrorDemo { 
 
 public static void main(String[] args) { 
  String temp = "java"; 
  //不斷地在堆中開辟空間,創(chuàng)建對(duì)象,撐爆堆內(nèi)存
  while (true) { 
    temp += temp + new Random().nextInt(111111111) + new Random().nextInt(222222222); 
    temp.intern(); 
  } 
 } 
}

3、內(nèi)存溢出之GC超過(guò)執(zhí)行限制錯(cuò)誤

package com.jayway.oom; 
 
import java.util.ArrayList; 
import java.util.List; 
 
/** 
 * GC超過(guò)執(zhí)行限制錯(cuò)誤 
 * 虛擬機(jī)參數(shù):-Xms10m -Xmx10m -XX:+PrintGCDetails -XX:MaxDirectMemorySize=5m 
 * * 拋出異常:Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded 
 * * 導(dǎo)致原因:GC回收時(shí)間過(guò)長(zhǎng)會(huì)拋出OutOfMemoryError,何為過(guò)長(zhǎng),即超過(guò)98%的cpu時(shí)間用來(lái)做GC垃圾回收 
 * 但是回收效果甚微,僅僅只有2%的CPU時(shí)間用來(lái)用戶程序的工作,這種狀態(tài)是很糟糕的,程序在不斷地GC 
 * 形成惡性循環(huán),CPU的使用率一直是滿負(fù)荷的,正經(jīng)活卻沒(méi)有干,這種情況虛擬機(jī)只好拋出錯(cuò)誤來(lái)終止程序的執(zhí)行 
 * 
 * 不斷地Full GC,事倍功微 
 * [Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7167K->7161K(7168K)] 9215K->9209K(9728K), [Metaspace: 3529K->3529K(1056768K)], 0.0291829 secs] [Times: user=0.08 sys=0.02, real=0.03 secs] 
 */
 public class GCOverheadErrorDemo { 
 
  public static void main(String[] args) { 
    int i = 0; 
    List<String> list = new ArrayList<>(); 
    try { 
      while (true) { 
      list.add(String.valueOf(++i).intern()); 
      } 
    } catch (Throwable e) { 
      System.out.println("*****************i:" + i); 
      e.printStackTrace(); 
      throw e; 
    } 
  } 
}

4、內(nèi)存溢出之直接內(nèi)存溢出錯(cuò)誤

package com.jayway.oom; 
 
import java.nio.ByteBuffer; 
 
/** 
 * 直接內(nèi)存溢出錯(cuò)誤 
 * 拋出異常:Exception in thread "main" java.lang.OutOfMemoryError: Direct buffer memory 
 * * 配置虛擬機(jī)參數(shù):-Xms10m -Xmx10m -XX:+PrintGCDetails -XX:MaxDirectMemorySize=5m 
 * * 導(dǎo)致原因:通常NIO程序經(jīng)常使用ByteBuffer來(lái)讀取或者寫入數(shù)據(jù),這是一種基于通道(Channel)與緩沖區(qū)(Buffer)的IO方式, 
 * 它可以使用Native函數(shù)庫(kù)直接分配堆外內(nèi)存,然后通過(guò)一個(gè)存儲(chǔ)在java堆里面的DirectByteBuffer對(duì)象作為這塊內(nèi)存的引用, 
 * 這樣能子一些場(chǎng)景中顯著提高性能,因?yàn)楸苊饬嗽贘ava堆和Native內(nèi)存中來(lái)回復(fù)制數(shù)據(jù)。 
 * 
 * ByteBuffer.allocate(capability):分配JVM堆內(nèi)存,數(shù)據(jù)GC的管轄范圍,由于需要拷貝所以速度相對(duì)較慢 
 * 
 * ByteBuffer.allocate(capability):分配OS本地內(nèi)存,不屬于GC管轄范圍,由于不需要內(nèi)存拷貝,所以速度相對(duì)較快。 
 * 
 * 但是如果不斷分配本地內(nèi)存,堆內(nèi)存很少使用,那么JVM就不需要執(zhí)行GC,DirectByteBuffer對(duì)象就不會(huì)被回收,此時(shí)如果繼續(xù)分配堆外內(nèi)存, 
 * 可能堆外內(nèi)存已經(jīng)被耗光了無(wú)法繼續(xù)分配,此時(shí)程序就會(huì)拋出OutOfMemoryError,直接崩潰。 
 * 
 */
 public class DirectBufferMemoryErrorDemo { 
 
  public static void main(String[] args) { 
    //默認(rèn)JVM配置的最大直接內(nèi)存是總物理內(nèi)存的四分之一 
    long maxDirectMemory = sun.misc.VM.maxDirectMemory() / 1024 / 1024; 
    System.out.println("配置的maxDirectMemory:" + maxDirectMemory + "MB"); 
 
    ByteBuffer byteBuffer = ByteBuffer.allocateDirect(6 * 1024 * 1024); 
  } 
 
}

5、內(nèi)存溢出之無(wú)法創(chuàng)建新的本地線程

package com.jayway.oom; 
 
/** 
 * 內(nèi)存溢出之無(wú)法創(chuàng)建新的本地線程 
 * 拋出異常:java.lang.OutOfMemoryError: unable to create new native thread 
 * * 描述: 
 * 高并發(fā)請(qǐng)求服務(wù)器時(shí),經(jīng)常出現(xiàn)java.lang.OutOfMemoryError: unable to create new native thread 
 *   native thread異常與對(duì)應(yīng)的平臺(tái)有關(guān) 
 * 
 * 導(dǎo)致原因: 
 *   1、應(yīng)用程序創(chuàng)建了太多線程了,一個(gè)應(yīng)用進(jìn)程創(chuàng)建的線程數(shù)超過(guò)系統(tǒng)承載極限。 
 *   2、操作系統(tǒng)并不允許你的應(yīng)用進(jìn)程創(chuàng)建這么多的線程,linux系統(tǒng)默認(rèn)允許單個(gè)進(jìn)程可以創(chuàng)建的線程數(shù)是1024個(gè) 
 * 
 * 解決方法: 
 *   1、想辦法降低應(yīng)用進(jìn)程創(chuàng)建的線程數(shù)量, 
 *   2、如果應(yīng)用程序確實(shí)需要這么多線程,超過(guò)了linux系統(tǒng)的默認(rèn)1024個(gè)限制,可以通過(guò)修改linux服務(wù)器配置,提高這個(gè)閾值。 
 * 
 */
 public class UnableCreateNativeThreadErrorDemo { 
 
  public static void main(String[] args) { 
    for (int i = 0; true; i++) { 
      System.out.println("***************i:" + i); 
 
      //不斷得創(chuàng)建新線程,直到超過(guò)操作系統(tǒng)允許應(yīng)用進(jìn)程創(chuàng)建線程的極限 
      new Thread(() -> { 
        try { 
          Thread.sleep(Integer.MAX_VALUE); 
        } catch (InterruptedException e) { 
          e.printStackTrace(); 
        } 
      }).start(); 
    } 
  } 
}

6、內(nèi)存溢出之元空間溢出錯(cuò)誤

package com.jayway.oom; 
 
import org.springframework.cglib.proxy.Enhancer; 
import org.springframework.cglib.proxy.MethodInterceptor; 
import org.springframework.cglib.proxy.MethodProxy; 
 
import java.lang.reflect.Method; 
 
/** 
 * 元空間溢出錯(cuò)誤 
 * 拋出異常:java.lang.OutOfMemoryError: Metaspace 
 * * 設(shè)置虛擬機(jī)參數(shù):-XX:MetaspaceSize=8m -XX:MaxMetaspaceSize=8m 
 * * 描述:Java8及以后的版本使用Metaspace來(lái)替代了永久代。metaspace是方法區(qū)在HotSpot中的實(shí)現(xiàn),它與持久代最大的區(qū)別在于 
 *   Metaspace并不在虛擬機(jī)內(nèi)存中而是在本地內(nèi)存中。 
 * 
 * 元空間存儲(chǔ)了以下信息: 
 *   1、虛擬機(jī)加載的類信息 
 *   2、常量池 
 *   3、靜態(tài)變量 
 *   4、即時(shí)編譯后的代碼 
 * 
 */
 public class MetaspaceErrorDemo { 
 
  static class OOMTest { 
  } 
 
  public static void main(String[] args) { 
    int count = 0; 
 
    try { 
    //cglib不斷創(chuàng)建類,模擬Metaspace空間溢出,我們不斷生成類往元空間中灌,超過(guò)元空間大小后就會(huì)拋出元空間移除的錯(cuò)誤 
      while (true) { 
        count++; 
        Enhancer enhancer = new Enhancer(); 
        enhancer.setSuperclass(OOMTest.class); 
        enhancer.setUseCache(false); 
        enhancer.setCallback(new MethodInterceptor() { 
          @Override 
          public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { 
            return methodProxy.invokeSuper(o, args); 
          } 
        }); 
        enhancer.create(); 
      } 
    } catch (Throwable e) { 
      System.out.println("************多少次后發(fā)生了異常:" + count); 
      e.printStackTrace(); 
    } 
  } 
}

以上就是Java虛擬機(jī)常見內(nèi)存溢出錯(cuò)誤匯總的詳細(xì)內(nèi)容,更多關(guān)于Java虛擬機(jī)內(nèi)存溢出的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 使用restTemplate遠(yuǎn)程調(diào)controller路徑取數(shù)據(jù)

    使用restTemplate遠(yuǎn)程調(diào)controller路徑取數(shù)據(jù)

    這篇文章主要介紹了使用restTemplate遠(yuǎn)程調(diào)controller路徑取數(shù)據(jù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • mybatis-plus分頁(yè)如何接收前端參數(shù)limit和page

    mybatis-plus分頁(yè)如何接收前端參數(shù)limit和page

    這篇文章主要介紹了mybatis-plus分頁(yè)如何接收前端參數(shù)limit和page,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • SpringBoot讀取excel表格的示例代碼

    SpringBoot讀取excel表格的示例代碼

    這篇文章主要介紹了SpringBoot讀取excel表格的示例代碼,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • JAVA中Context的詳細(xì)介紹和實(shí)例分析

    JAVA中Context的詳細(xì)介紹和實(shí)例分析

    這篇文章主要介紹了JAVA中Context的詳細(xì)介紹和實(shí)例分析,Context是維持android各組件能夠正常工作的一個(gè)核心功能類。如果感興趣來(lái)學(xué)習(xí)一下
    2020-07-07
  • Java獲取支付寶OpenID的實(shí)現(xiàn)方法

    Java獲取支付寶OpenID的實(shí)現(xiàn)方法

    在Java中,通過(guò)支付寶開放平臺(tái)API可以獲取用戶的OpenID,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-09-09
  • Springboot?集成spring?cache緩存的解決方案

    Springboot?集成spring?cache緩存的解決方案

    這篇文章主要介紹了Springboot?集成spring?cache緩存,使用緩存最關(guān)鍵的一點(diǎn)就是保證緩存與數(shù)據(jù)庫(kù)的數(shù)據(jù)一致性,本文給大家介紹最常用的緩存操作模式,對(duì)Springboot?集成spring?cache緩存操作流程感興趣的朋友一起看看吧
    2022-06-06
  • IDEA代碼警告(warning)整理以及解決方案

    IDEA代碼警告(warning)整理以及解決方案

    在日常開發(fā)中,IntelliJ?IDEA會(huì)通過(guò)problems窗口和編輯窗口的黃色標(biāo)記提示警告,這些警告可能指示代碼存在潛在風(fēng)險(xiǎn)或需要優(yōu)化的空間,文章介紹了如何利用IDEA檢查代碼,以及針對(duì)常見警告的原因和解決辦法
    2024-10-10
  • SpringBoot整合阿里云開通短信服務(wù)詳解

    SpringBoot整合阿里云開通短信服務(wù)詳解

    這篇文章主要介紹了如何利用SpringBoot整合阿里云實(shí)現(xiàn)短信服務(wù)的開通,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)有一定幫助,需要的可以參考一下
    2022-03-03
  • JavaWeb的監(jiān)聽器和過(guò)濾器你了解嗎

    JavaWeb的監(jiān)聽器和過(guò)濾器你了解嗎

    這篇文章主要為大家詳細(xì)介紹了JavaWeb的監(jiān)聽器和過(guò)濾器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-02-02
  • SpringMVC上傳文件的兩種方法

    SpringMVC上傳文件的兩種方法

    這篇文章主要為大家詳細(xì)介紹了SpringMVC上傳文件的兩種方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11

最新評(píng)論

郧西县| 南郑县| 金寨县| 华蓥市| 阳泉市| 肇庆市| 洛川县| 黄龙县| 扶沟县| 灵山县| 仙桃市| 潮安县| 德庆县| 隆尧县| 平潭县| 武陟县| 鄯善县| 仁寿县| 永登县| 区。| 宁武县| 集安市| 绍兴县| 吴桥县| 辰溪县| 汾西县| 梁山县| 聂拉木县| 金堂县| 拜城县| 北安市| 饶河县| 石泉县| 汶川县| 达孜县| 石台县| 蕉岭县| 江川县| 尉氏县| 九龙坡区| 台安县|