jvm内存模型分析(5)堆内存溢出以及分析
jvm内存模型分析(5)堆内存溢出以及分析
1.模拟堆内存溢出代码
package test;
import java.util.ArrayList;
import java.util.List;
/**
* VM Args:-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError
* @author zzm
*/
public class HeapOOM {
static class OOMObject {
}
public static void main(String[] args) {
List<OOMObject> list = new ArrayList<OOMObject>();
while (true) {
list.add(new OOMObject());
}
}
}
2.jvm启动参数设置
目的是因为jvm虚拟机初始的内存还是挺大的,所以缩小堆内存,来快速实现内存溢出。
-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError
3.程序运行结果:
java.lang.OutOfMemoryError: Java heap space
Dumping heap to java_pid8452.hprof ...
Heap dump file created [27943398 bytes in 0.070 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Unknown Source)
at java.util.Arrays.copyOf(Unknown Source)
at java.util.ArrayList.grow(Unknown Source)
at java.util.ArrayList.ensureExplicitCapacity(Unknown Source)
at java.util.ArrayList.ensureCapacityInternal(Unknown Source)
at java.util.ArrayList.add(Unknown Source)
at test.HeapOOM.main(HeapOOM.java:15)
4.分析:
Java堆用于存储对象实例,只要不断地创建对象,并且保证 GC Roots到对象之间有可达路径来避免垃圾回收机制清除这些对象,那么在对象数量到达最大堆的容量限制后就会产生内存溢出异常。
代码中限制Java堆的大小为20MB,不可扩展(将堆的最小值-Xms参数与最大值-Xmx参数设置为一样即可避免堆自动扩展),通过参数-XX+Heap DumpOnOutofMemoryError可以让虚拟机在出现内存溢出异常时Dump出当前的内存堆转储快照以便事后进行分析。
程序运行结束以后刷新文件夹会出现一个快照文件
然后利用eclipse memory analyzer内存分析工具,进行分析,定位出现问题的类,和方法,从而找到解决问题的方法
从中我们可以发现,在主线程中,也就是main函数中创建了大量的 OOMObject 对象,并且对象被list集合应用,无法被释放,导致内存溢出。从而定位到问题。
评论区
请写下您的评论...
猜你喜欢
blog
jvm内存模型分析(1)
java虚拟机(jvm)
3040
jvm内存模型分析(1)Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域jvm包括三大子系统:类加载子系统,运行时数据区(内存结构),执行引擎详细图示
blog
jvm内存模型分析(2)之方法执行的过程
java虚拟机(jvm)
4780
jvm内存模型分析(1)已经对内存模型进行了一个宏观的概括http://www.jiajiajia.club/weblog/blog/artical/82那么下边具体分析一下方法执行的过程还是以一个
blog
Jvm内存模型分析-class文件结构
java虚拟机(jvm)
6026
Jvm内存模型分析-class文件结构以下面的类为例介绍一下class文件的结构packagejvm;publicclassMainTest{publicstaticinta=0
java虚拟机(jvm)
1610
jvm内存模型分析-垃圾收集器和内存分配策略(1)说起垃圾收集(GarbagcCollcction,GC),大部分人都把这项技术当做java语言的伴生产物。事实上,GC的历史比Java久远,1960
java虚拟机(jvm)
3829
类加载的时机类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(LoadingVerification)、准备(Preparation)、解析(Resolution)、初始化
java虚拟机(jvm)
2251
jmap是java虚拟机自带的一种内存映像工具,我们可以通过该工具配合不同的参数来查看java虚拟机内存的详细信息(如程序中出现的所有对象的数量以及占用内存大小等),以及通过虚拟机内存的使用情况来定
java虚拟机(jvm)
2477
这里以HotSpot为例,且所说的对象指普通的Java对象,不包括数组和Class对象等。参考资料深入理解java虚拟机《周志明》1.对象的内存布局HotSpot虚拟机中,对象在内存中存储的布局可以
blog
jvm内存模型分析(3)之局部变量表
java虚拟机(jvm)
3925
(StackFrame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。局部变量表是一组变量值存储空间,用于存放方法参数和方法内部定义的局部变量。在Java程序被编译为Class文件时,就在方法的Code属性
最新发表
归档
2018-11
12
2018-12
33
2019-01
28
2019-02
28
2019-03
32
2019-04
27
2019-05
33
2019-06
6
2019-07
12
2019-08
12
2019-09
21
2019-10
8
2019-11
15
2019-12
25
2020-01
9
2020-02
5
2020-03
16
2020-04
4
2020-06
1
2020-07
7
2020-08
13
2020-09
9
2020-10
5
2020-12
3
2021-01
1
2021-02
5
2021-03
7
2021-04
4
2021-05
4
2021-06
1
2021-07
7
2021-08
2
2021-09
8
2021-10
9
2021-11
16
2021-12
14
2022-01
7
2022-05
1
2022-08
3
2022-09
2
2022-10
2
2022-12
5
2023-01
3
2023-02
1
2023-03
4
2023-04
2
2023-06
3
2023-07
4
2023-08
1
2023-10
1
2024-02
1
2024-03
1
2024-04
1
2024-08
1
标签
算法基础
linux
前端
c++
数据结构
框架
数据库
计算机基础
储备知识
java基础
ASM
其他
深入理解java虚拟机
nginx
git
消息中间件
搜索
maven
redis
docker
dubbo
vue
导入导出
软件使用
idea插件
协议
无聊的知识
jenkins
springboot
mqtt协议
keepalived
minio
mysql
ensp
网络基础
xxl-job
rabbitmq
haproxy
srs
音视频
webrtc
javascript
加密算法
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。