Java内存区域与模拟内存区域异常
我把Java的内存区域画了一张思维导图,以及各区域的主要功能。
模拟Java堆溢出
Java堆用于存储对象实例。仅仅要不断地创建对象而且保证GC ROOTS到对象之间有可达路径避免被回收机制清除。就能够模拟出Java堆溢出。
package hxl.insist.jvm;
import java.util.ArrayList;
import java.util.List;
/**
* 以下是JVM Args:
* -Xms20m 堆的最小值 -Xmx20m 堆的最小值 (设置为一样可避免堆自己主动扩展)
* -XX:+HeapDumpOnOutOfMemoryError 当虚拟机出现内存溢出异常时,Dump出当前的堆转储快照
* -XX:HeapDumpPath=E:\eclipseworkspace\UnderStandingTheJVM\hprof 设置生成的堆转储快照的路径
* @author hanxl
*
*/
public class HeapOutOfMemory {
static class StuffObject {
}
static List<StuffObject> list = new ArrayList<StuffObject>();
public static void main(String[] args) {
Thread thread = new Thread(new Runnable() {
public void run() {
createObj();
}
});
thread.start();
}
private static void createObj() {
while (true) {
list.add(new StuffObject());
}
}
}
用MemoryAnalyzer分析一下堆转储快照例如以下图:
从根元素到内存消耗聚集点的最短路径,能够非常清楚的看到整个引用链。
在上面这张图上,我们能够清楚的看到,这个对象集合中保存了大量内部类StuffObject 对象的引用,就是它导致的内存泄露。
模拟Java虚拟机栈溢出
关于虚拟机栈,在Java虚拟机中规范了两种异常:
- 假设线程请求的栈深度大于虚拟机所同意的最大深度,将抛出StackOverflowError异常。
- 假设虚拟机地扩展栈时无法申请到足够的内存空间,则抛出OutOfMemoryError异常。
模拟第一种情况:
package hxl.insist.jvm;
/**
* 以下是JVM Args:
* -Xss128k 设置栈容量大小
* @author hanxl
*/
public class JavaVMStackSOF {
public void stackLeak() {
stackLeak();
}
public static void main(String[] args) throws Throwable {
new JavaVMStackSOF().stackLeak();
}
}
模拟另外一种情况:
package hxl.insist.jvm;
/**
* 以下是JVM Args:
* -Xss2M 设置栈容量大小
* @author hanxl
*/
public class JavaVMStackOOM {
public static void main(String[] args) {
new JavaVMStackOOM().threadInvokeMethod();
}
public void threadInvokeMethod() {
while (true) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
infiniteLoop();
}
});
thread.start();
}
}
private void infiniteLoop() {
while (true)
;
}
}
比較两种情况为什么实现方式不同?
Java虚拟机栈是线程私有的,它的生命同期与线程同样。我们把虚拟机栈比做一个盒子,-Xss是设置盒子的大小,而一个线程仅仅能相应一个盒子。而每一个Java方法在运行的时候都会在盒子中创建一个栈帧用于存储局部变量表等一些信息。
所以为了制造出第一种情况下的异常,我们把盒子的大小设置小一点,使用递归不断调用方法,从而撑破盒子。而为了制造出另外一种情况下的异常,我们应该把盒子的大小设置小大一点,多创建一些盒子,从而让其无法申请到足够的内存空间。
仅仅要了解上面那张思维导图的内存区域,模拟出其他内存区域异常也非常easy。
Java内存区域与模拟内存区域异常的更多相关文章
- Java内存区域-- 运行时数据区域
jvm在执行Java程序时,会把它所管理的内存划分为若干个不同的数据区.这些区域都有各自的用途,以及创建和销毁的时间. 有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销 ...
- Java内存管理原理及内存区域详解
一.概述 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干不同的数据区域,这些区域都有各自的用途以及创建和销毁的时间.Java虚拟机所管理的内存将会包括以下几个运行时数据区域,如下 ...
- Java内存管理以及各个内存区域详解
一.概述 原文链接:http://blog.csdn.net/l271640625/article/details/39761439 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若 ...
- 深入理解Java虚拟机读书笔记1----Java内存区域与HotSpot虚拟机对象
一 Java内存区域与HotSpot虚拟机对象 1 Java技术体系.JDK.JRE? Java技术体系包括: · Java程序设计语言: · 各种硬件平台上的 ...
- Java的内存管理机制之内存区域划分
各位,好久不见.先做个预告,由于最近主要在做Java服务端开发,最近一段时间会更新Java服务端开发相关的一些知识,包括但不限于一些读书笔记.框架的学习笔记.和最近一段时间的思考和沉淀.先从Java虚 ...
- Java内存区域划分、内存分配原理(转)
文章引用自 http://blog.csdn.net/OyangYujun/article/details/41173747 运行时数据区域 Java虚拟机在执行Java的过程中会把管理的内存划分为若 ...
- Java内存区域划分、内存分配原理(深入理解JVM一)
Java虚拟机在执行Java的过程中会把管理的内存划分为若干个不同的数据区域.这些区域有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,而有的区域则依赖线程的启动和结束而创建和销 ...
- java内存结构(执行时数据区域)
java虚拟机规范规定的java虚拟机内存事实上就是java虚拟机执行时数据区,其架构例如以下: 当中方法区和堆是由全部线程共享的数据区. Java虚拟机栈.本地方法栈和程序计数器是线程隔离的数据区. ...
- Java内存区域(运行时数据区域)和内存模型(JMM)
Java 内存区域和内存模型是不一样的东西,内存区域是指 Jvm 运行时将数据分区域存储,强调对内存空间的划分. 而内存模型(Java Memory Model,简称 JMM )是定义了线程和主内存之 ...
随机推荐
- imx6移植librtmp
一.openssl交叉编译 1.下载 https://www.openssl.org/source/ 版本不要太高,刚开始版本高了,有些函数取消了,链接不上 使用1.0.1f即可 2.编译成共享库 . ...
- Android数据储存之File
openFileOutStream 和 openFileInStream FileInputStream fileInputStream = openFileInput(name); 打开应用下文件 ...
- astyle使用基础教程
astyle使用基础教程 转自: http://babybandf.blog.163.com/blog/static/61993532010112205811797/ astyle是一个我自己常用的开 ...
- PAT1024
科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[+-][1-9]"."[0-9]+E[+-][0-9]+,即数字的整数部分只有1位,小数部分至少有1位 ...
- 基于Jquery的商城商品图片的放大镜效果(非组件)
在开发商城的时候,往往会用到图片的放大功能,这里把自己在近期项目中使用的放大镜特效做一下总结(非插件). 放大镜效果 常用的js组件jquery.imagezoom,jquery.jqzoom,jqu ...
- Android实现金额显示小数点后两位
代码改变世界 Android实现金额显示小数点后两位 NumberFormat nf = new DecimalFormat("##.##"); Double d = 554545 ...
- vmware esxi 查看网卡、Raid卡驱动
vmware esxi 查看网卡.Raid卡驱动 http://blog.51cto.com/adamcrab/1942763 查看网卡 [root@localhost:~] esxcfg-nics ...
- [bzoj4259][bzoj4503] 残缺的字符串 [FFT]
题面 传送门 bzoj上的这两题是一样的...... 正文 我看到这道题,第一想法是跑魔改过的KMP,然后很快发现不可行 于是想换个角度思考 其实,本题最大的问题就在于通配符的存在:它可以匹配任意一个 ...
- bzoj 2435 dfs处理
Description 在 W 星球上有 n 个国家.为了各自国家的经济发展,他们决定在各个国家 之间建设双向道路使得国家之间连通.但是每个国家的国王都很吝啬,他们只愿 意修建恰好 n – 1条双向道 ...
- C++ Contest Code preprocessor
大概可以拿来方便拉模板 变量名.语法都是瞎整的你感觉有用随便用好了.. #include<bits/stdc++.h> using namespace std; map<string ...