Java堆内存溢出模拟
先了解一下Java堆:
关于Java内存区域的分配,可以查看Java运行时数据区域一篇文章。
Java堆是虚拟机内存管理中最大的一块区域,该区域是线程共享的,某Java进程中所有的线程都可以访问该区域中的数据。Java堆中大部分区域是存放的实例对象,就是我们常说的Java面向对象编程中的对象。比如我创建了一个类,要通过这个类的构造函数new一个对象,new出来的这个对象就是存放在Java堆上。根据对象产生时间和引用时间的长短,可以细分为新生代和老年代。
通过-Xms和-Xmx参数控制虚拟机启动时Java堆的大小。如果实例对象没有在Java堆上分配,并且堆无法扩展,将会抛出OutOfMemoryError异常。
接下来模拟一下Java堆的溢出。以下是测试代码:
package com.woasis.jvm.classloading; import java.util.ArrayList;
import java.util.List; /**
* 模拟堆溢出
* -Xms20M 最小初始内存
* -Xmx20M 最大内存值
* -XX:+HeapDumpOnOutOfMemoryError
*/
public class DeapOutOfMemory { /**
* 内部类,用于创建对象,存于堆内存中
*/
static class TestOOM{ } public static void main(String[] args) { //用于存放模拟的对象,防止GC回收,用List做对象引用
List<TestOOM> list = new ArrayList<>(); for (;;){
list.add(new TestOOM());
}
}
}
便于模拟溢出,和抓取内存溢出时的内存快照,如下图设置虚拟机参数:
-Xms20M Java堆内存初始化大小为20M
-Xmx20M Java堆内存最大值为20M
-XX:+HeapDumpOnOutOfMemoryError 当发生OutOfMemoryError异常时抓取Java堆快照。其中 + 是打开的意思。
设置好虚拟机内存参数后运行Main方法。如下图出现OutOfMemoryError异常,发生的地方是Java Heap Space。
对抓取的快照进行打开,如下图,可以看到内部类TestOOM实例对象数量是810326。
Java堆内存溢出模拟的更多相关文章
- 关于java堆内存溢出的几种情况(转)
[情况一]: java.lang.OutOfMemoryError: Java heap space:这种是java堆内存不够,一个原因是真不够,另一个原因是程序中有死循环: 如果是java堆内存不够 ...
- OutOfMemoryError/OOM/内存溢出异常实例分析--堆内存溢出
Java堆内存溢出 只要不断创建对象,并且保证GC Roots到对象之间有可达路径来避免垃圾回收机制清除这些对象, 那么在对象数量到达最大堆的容量限制后就会产生内存溢出异常,代码如下: import ...
- Java中常见内存溢出模拟及错误分析
在JVM虚拟机规范中,Java虚拟机运行时数据区域除了程序计数器(Program Counter Register)外都有可能出现OutOfMemoryError的情况,使用Hotspot虚拟机简单的 ...
- Java堆内存又溢出了!教你一招必杀技
JAVA堆内存管理是影响性能主要因素之一.堆内存溢出是JAVA项目非常常见的故障,在解决该问题之前,必须先了解下JAVA堆内存是怎么工作的. 先看下JAVA堆内存是如何划分的,如图: JVM内存划分为 ...
- Java抛出OutOfMemoryError:Java heap space堆内存溢出错误的分析方案
抛出堆内存溢出的错误一定要记得保留现场环境(导出堆内存信息到文件),否则如果无法进行分析,并从根本上解决问题,下次很有可能还会出现. 第一步:导出堆转储文件 我们可以使用Jdk自带的jmap工具.使用 ...
- JVM:Java常见内存溢出异常分析
转载自:http://www.importnew.com/14604.html Java虚拟机规范规定JVM的内存分为了好几块,比如堆,栈,程序计数器,方法区等,而Hotspot jvm的实现中,将堆 ...
- 自己挖的坑自己填--jxl进行Excel下载堆内存溢出问题
今天在进行使用 jxl 进行 Excel 下载时,由于数据量大(4万多条接近5万条数据的下载),数据结构过于负责,存在大量大对象(虽然在对象每次用完都设置为null,但还是存在内存溢出问题),加上本地 ...
- (2)java堆内存
java堆内存结构图 [名词解释]--->eden,so,s1通称为新生代对象储区--->tenured称为老年代对象存储区--->s0和s1也称为from和to区域,是两块大小相等 ...
- Java虚拟机内存溢出异常--《深入理解Java虚拟机》学习笔记及个人理解(三)
Java虚拟机内存溢出异常--<深入理解Java虚拟机>学习笔记及个人理解(三) 书上P39 1. 堆内存溢出 不断地创建对象, 而且保证创建的这些对象不会被回收即可(让GC Root可达 ...
随机推荐
- CocoStudio
不知道从哪里下载的CocoStudio_Full_V1.0.0.1.1185392965.exe 安装后点击"Animation Editor"."UI Editor&q ...
- 20155206 2016-2017-2 《Java程序设计》第9周学习总结
20155206 2016-2017-2 <Java程序设计>第9周学习总结 教材学习内容总结 第十六章 JDBC简介 撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找 ...
- 2018.09.19 atcoder Snuke's Subway Trip(最短路)
传送门 就是一个另类最短路啊. 利用颜色判断当前节点的最小花费的前驱边中有没有跟当前的边颜色相同的. 如果有这条边费用为0,否则费用为1. 这样跑出来就能ac了. 代码: #include<bi ...
- 2018.07.23[PA2015]Siano(线段树)
[PA2015]Siano 描述 Description 农夫Byteasar买了一片n亩的土地,他要在这上面种草. 他在每一亩土地上都种植了一种独一无二的草,其中,第i亩土地的草每天会长高a[i]厘 ...
- Yii框架请求
$request = Yii::$app->request; $get = $request->get(); // 等价于: $get = $_GET; $id = $request-&g ...
- linux中nfs启动报rpcbind.socket failed to listen on sockets: Address family not supported by protocol
1.systemctl start rpcbind.service 报错: [root@autodeploy ~]# journalctl -xe -- Support: http://lists.f ...
- Linux抓包
默认系统里边没有安装有tcpdump的,无法直接使用 这里我们可以使用yum来直接安装它 yum install -y tcpdump 如果忘记了这个软件的用法,我们可以使用 tcpdump ...
- 转一个Visual Stuido 快捷键
http://www.shortcutworld.com/en/win/Visual-Studio_2010.html 快捷键分类很详细.
- 简单的cxf-ws 基于web容器
pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w ...
- Windows 下安装ReText
打算使用MarkDown了,群友推荐使用ReText,基于Python的,同时依赖了Python的几个包,通过easystall可以方便地安装,同时制作了快捷启动方式,网上找了篇文章以备忘. Inst ...