日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JAVA内存溢出异常测试

發布時間:2024/3/24 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JAVA内存溢出异常测试 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文章為看《深入理解JAVA虛擬機》的筆記

  • JAVA堆異常溢出:
  • /*** Vm args:-Xms20M -Xmx20M -XX:+HeapDumpOnOutOfMemoryError* 堆的最小值參數-Xms,堆的最大值參數-Xmx* -XX:+HeapDumpOnOutOfMemoryError表示讓虛擬機在出現內存異常時Dump出當前的內存對快照* java 堆內存溢出測試,深入理解java虛擬機 p51* @author Rail**/ public class HeapOutOfMemoryError {static class OutOfMemoryError{}public static void main(String[] args) {List<OutOfMemoryError> list = new ArrayList<OutOfMemoryError>();while(true){list.add(new OutOfMemoryError());}}}

    運行結果:

    java.lang.OutOfMemoryError: Java heap space
    Dumping heap to java_pid4208.hprof …
    Heap dump file created [1029185391 bytes in 10.681 secs]

    2.JAVA虛擬機棧和本地方法棧溢出:

    1) 在Hotspot中,不區分JAVA虛擬機棧和本地方法棧。在JAVA虛擬機規范中描述了兩種與之相關的異常:

    • 如果線程請求的棧深度超出了虛擬機允許的最大深度,將拋出StackOverflowError異常,測試代碼:
    /*** VM args:-Xss128k* -Xss128k 減小棧內存至128k* @author Rail**/ public class JavaVMStackOverFlowError {private int stackLength = 1;public void stackLeak(){stackLength++;stackLeak();}public static void main(String[] args){JavaVMStackOverFlowError sof = new JavaVMStackOverFlowError();try{sof.stackLeak();}catch(Throwable e){System.out.println("stackLength: "+sof.stackLength);throw e;}} }

    打印結果:

    stackLength: 989
    Exception in thread “main” java.lang.StackOverflowError
    at jvm.JavaVMStackOverFlowError.stackLeak(JavaVMStackOverFlowError.java:11)

    • 如果虛擬機在擴展棧時無法申請到足夠的內存空間,則拋出OutOfMemoryError,測試代碼:
    /*** VM args:-Xss2M* 該程序執行容易死機,我的電腦運行死機兩次* @author Rail**/ public class JavaVMStatckOutOfMemoryError {public void dontStop(){while(true){ }}public void stackLeakByThread(){while(true){Thread t = new Thread(new Runnable() {@Overridepublic void run() {dontStop();}});t.start();}}public static void main(String[] args) {JavaVMStatckOutOfMemoryError sofm = new JavaVMStatckOutOfMemoryError();sofm.stackLeakByThread();}}

    運行結果,本人電腦運行時死機兩次,未成功輸出結果,在書上的輸出結果為:

    Exception in thread main java.lang.OutOfMemoryError:unable to create new native thread

    3.方法區和運行時常量池溢出:

    /*** VM args:-XX:PermSize10M -XX:MaxPermSize=10M* PermSize 方法區大小* @author Rail**/ public class RuntimeContantPoolOutOfMemoryError {public static void main(String[] args) {//保存對常量池字符串的應用,避免Full GC回收常量池的行為List<String> list = new ArrayList<String>();//10M在int的范圍足夠產生OutOfMemoryErrorint i = 0;while(true){list.add(String.valueOf(i++));}}}

    運行結果,在jdk6及之前,常量池分配在永久代內,通過-XX:PermSize10M -XX:MaxPermSize=10M限制其大小,而:

    Exception in thread “main” java.lang.OutOfMemoryError: Java heap space
    at java.lang.Integer.toString(Integer.java:401)
    at java.lang.String.valueOf(String.java:3087)
    at jvm.RuntimeContantPoolOutOfMemoryError.main(RuntimeContantPoolOutOfMemoryError.java:17)
    Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize10M; support was removed in 8.0
    Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=10M; support was removed in 8.0

    總結

    以上是生活随笔為你收集整理的JAVA内存溢出异常测试的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。