我把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虚拟机中规范了两种异常:

  1. 假设线程请求的栈深度大于虚拟机所同意的最大深度,将抛出StackOverflowError异常。
  2. 假设虚拟机地扩展栈时无法申请到足够的内存空间,则抛出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内存区域与模拟内存区域异常的更多相关文章

  1. Java内存区域-- 运行时数据区域

    jvm在执行Java程序时,会把它所管理的内存划分为若干个不同的数据区.这些区域都有各自的用途,以及创建和销毁的时间. 有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销 ...

  2. Java内存管理原理及内存区域详解

    一.概述 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干不同的数据区域,这些区域都有各自的用途以及创建和销毁的时间.Java虚拟机所管理的内存将会包括以下几个运行时数据区域,如下 ...

  3. Java内存管理以及各个内存区域详解

    一.概述 原文链接:http://blog.csdn.net/l271640625/article/details/39761439 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若 ...

  4. 深入理解Java虚拟机读书笔记1----Java内存区域与HotSpot虚拟机对象

    一 Java内存区域与HotSpot虚拟机对象 1 Java技术体系.JDK.JRE?     Java技术体系包括:         · Java程序设计语言:         · 各种硬件平台上的 ...

  5. Java的内存管理机制之内存区域划分

    各位,好久不见.先做个预告,由于最近主要在做Java服务端开发,最近一段时间会更新Java服务端开发相关的一些知识,包括但不限于一些读书笔记.框架的学习笔记.和最近一段时间的思考和沉淀.先从Java虚 ...

  6. Java内存区域划分、内存分配原理(转)

    文章引用自 http://blog.csdn.net/OyangYujun/article/details/41173747 运行时数据区域 Java虚拟机在执行Java的过程中会把管理的内存划分为若 ...

  7. Java内存区域划分、内存分配原理(深入理解JVM一)

    Java虚拟机在执行Java的过程中会把管理的内存划分为若干个不同的数据区域.这些区域有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,而有的区域则依赖线程的启动和结束而创建和销 ...

  8. java内存结构(执行时数据区域)

    java虚拟机规范规定的java虚拟机内存事实上就是java虚拟机执行时数据区,其架构例如以下: 当中方法区和堆是由全部线程共享的数据区. Java虚拟机栈.本地方法栈和程序计数器是线程隔离的数据区. ...

  9. Java内存区域(运行时数据区域)和内存模型(JMM)

    Java 内存区域和内存模型是不一样的东西,内存区域是指 Jvm 运行时将数据分区域存储,强调对内存空间的划分. 而内存模型(Java Memory Model,简称 JMM )是定义了线程和主内存之 ...

随机推荐

  1. 拼多多2018校招编程题汇总 Python实现

    题目原址 列表补全 在商城的某个位置有一个商品列表,该列表是由L1.L2两个子列表拼接而成.当用户浏览并翻页时,需要从列表L1.L2中获取商品进行展示.展示规则如下: 用户可以进行多次翻页,用offs ...

  2. svm常用核函数

    SVM核函数的选择对于其性能的表现有至关重要的作用,尤其是针对那些线性不可分的数据,因此核函数的选择在SVM算法中就显得至关重要.对于核技巧我们知道,其目的是希望通过将输入空间内线性不可分的数据映射到 ...

  3. c++面试须知

    这些都是从zhihu上看到的. 指针,多态(虚函数表.内存layout),作用域,内存的管理 算法与数据结构,数据结构上由掌握哈希.优先级队列,算法上有字符串处理,简单的DFS.BFS.动态规划 系统 ...

  4. [转]Jupyter NoteBook 的快捷键使用指南

  5. leetcode NO.53 最大子序列和 (python实现)

    来源 https://leetcode-cn.com/problems/maximum-subarray/description/ 题目描述 给出一个 32 位的有符号整数,你需要将这个整数中每位上的 ...

  6. nyoj 题目19 擅长排列的小明

    擅长排列的小明 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 小明十分聪明,而且十分擅长排列计算.比如给小明一个数字5,他能立刻给出1-5按字典序的全排列,如果你想 ...

  7. EasyUi DataGrid 获取选中行的checkbox

    EasyUi DataGrid 获取选中行的checkbox var checked = $(":checkbox[name=ID]:checked"); console.log( ...

  8. [NOI2014][bzoj3670] 动物园 [kmp+next数组应用]

    题面 传送门 思路 首先,这题最好的一个地方,在于它给出的关于$next$的讲解实在是妙极......甚至可以说我的kmp是过了这道题以后才脱胎换骨的 然后是正文: 如何求$num$数组? 这道题的输 ...

  9. 洛谷P3245 [HNOI2016]大数 【莫队】

    题目 题解 除了\(5\)和\(2\) 后缀数字对\(P\)取模意义下,两个位置相减如果为\(0\),那么对应子串即为\(P\)的倍数 只用对区间种相同数个数\(x\)贡献\({x \choose 2 ...

  10. Django使用js,css等静态文件的时候,出现mime类型问题

    使用adminLTE模板, return render(request, 'AdminLTE/index.html') 的时候报如下错误且页面渲染异常,css没有效果: Resource interp ...