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内存溢出异常测试相关推荐
- Java内存溢出异常(下)
此篇是上一篇文章Java内存溢出异常(上)的续篇,没有看过的同学,可以先看一下上篇.本篇文章将介绍剩余的两个溢出异常:方法区和运行时常量池溢出. 方法区和运行时常量池溢出 这部分为什么会放在一起呢?在 ...
- Java内存溢出异常及其处理
熟悉Java内存划分及运行的首要目的就是预防JVM抛出内存溢出相关的异常,或者说当发生这样异常是该如何排查问题,定位问题并且给出合理的解决方案,这对于开发工作以及后期维护工作的顺利进行尤为重要 ...
- java ppt转图片 内存溢出_Java虚拟机内存及内存溢出异常
Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进来,墙里面的人却想出来. 不知道其他人想出来没,反正我是没想出来,为什么这个JVM的运行时内存要这样设计?. 以下内容 ...
- java 二维数组内存溢出_程序员:学习心得,Java内存区域,内存溢出异常
Java 内存区域 Heap 线程公有 存放实例对象 是GC主要管理区域,因此可以更细致的划分为:新生代.老年代 再细致一点划分:Eden区.From Survivor区.To Survivor区 内 ...
- java 二维数组内存溢出_模拟Java内存溢出
本文通过修改虚拟机启动参数,来剖析常见的java内存溢出异常(基于jdk1.8). 修改虚拟机启动参数 这里我们使用的是IDEA集成开发环境,选择Run/Debug Configurations 然后 ...
- jvm(2)-OutOfMemoryError 异常(内存溢出异常)
[0]README 0.1)本文转自 深入理解 jvm, 旨在学习 OutOfMemoryError 异常(内存溢出异常) 的触发类型: 0)准备知识 0.1)除了程序计数器外,虚拟机内存的其他几个运 ...
- JVM最佳学习笔记一---Java内存区域与内存溢出异常
2019独角兽企业重金招聘Python工程师标准>>> 前言 本笔记参照了周志明<深入理解Java虚拟机:JVM高级特性与最佳实践>第三版,读完之后受益匪浅,让我对Jav ...
- 写java线程导致电脑内存不足_如何写出让java虚拟机发生内存溢出异常OutOfMemoryError的代码...
程序小白在写代码的过程中,经常会不经意间写出发生内存溢出异常的代码.很多时候这类异常如何产生的都傻傻弄不清楚,如果能故意写出让jvm发生内存溢出的代码,有时候看来也并非一件容易的事.最近通过学习< ...
- 《深入理解JVM.2nd》笔记(二):Java内存区域与内存溢出异常
文章目录 概述 运行时数据区域 程序计数器 Java虚拟机栈 本地方法栈 Java堆 方法区 运行时常量池 直接内存 HotSpot虚拟机对象探秘 对象的创建 第一步 第二步 第三步 第四步 最后一脚 ...
最新文章
- Could NOT find SDL (missing: SDL_LIBRARY SDL_INCLUDE_DIR)
- 解决remove @override annotation
- 前后端分离项目部署(服务器或本地)
- 学生用计算机说明方法,15.文中多处运用了作比较的说明方法.请任选一例.说说运用这种方法的作用. 例子: 作用:...
- php redis 搜索,PHP+Redis有序集合(zset)实现博客园阅读排行榜功能
- 【图像处理】彩色图像自适应对比度增强(OpenCV实现)
- 服务器报告它来自digest_2020年全球服务器市场规模及竞争格局分析
- 【MySQL】【备份】mydumper安装与使用细节
- arcgis for android 无法加载本地jpg影像解决办法
- java正则获取内容_Java利用正则表达式提取数据的方法
- 基于 WebRTC 构建 Web SIP Phone
- 马哥linux35期,马哥Linux第五周
- C语言作业练习1:输入一个数判断是否为素数
- matlab对数组中的某一列进行排序
- Python—Scrapy爬取京东商城
- Linux下载HTTP文件
- handsome for Typecho主题重建备忘
- 洛谷[P3374] [P3368]树状数组(线段树解法)
- fiddler抓包 - Android 虚拟机
- Codeforces Round #694 (Div. 2) F. Strange Housing (贪心思维)