JAVA内存溢出异常测试
本文章為看《深入理解JAVA虛擬機》的筆記
運行結果:
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異常,測試代碼:
打印結果:
stackLength: 989
Exception in thread “main” java.lang.StackOverflowError
at jvm.JavaVMStackOverFlowError.stackLeak(JavaVMStackOverFlowError.java:11)
- 如果虛擬機在擴展棧時無法申請到足夠的內存空間,則拋出OutOfMemoryError,測試代碼:
運行結果,本人電腦運行時死機兩次,未成功輸出結果,在書上的輸出結果為:
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内存溢出异常测试的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数组截取数据slice()函数
- 下一篇: HTML5网站展示:48个潜在的Flas