JVM学习日记-.-内存管理系列之探秘堆

350 阅读3分钟

“这是我参与8月更文挑战的第7天,活动详情查看:8月更文挑战

引言

今天是第七天,起了个大早,就算周末的我也是异常的勤快(呜呜,其实是被蚊子咬醒了),既然醒了,就不要浪费time,要做真正有价值有有意义的事情,于是我就出来肝了这篇软文,jvm系列的学习已经有7篇了,介绍了很多jvm的内容,从为什么学习到初识到了解,跟着我,我们会慢慢地学习,慢慢地消化,相信我你会爱上它的(反正吹牛也不上税),闲话少说,今天来肝OOM

java堆异常

我们前面提到了,jvm是如何创建和引用我们的对象的,估计记得的小伙伴已经寥寥无几了,没关系,我们的目的就是让小伙伴(从入门到放弃),也就是说我们后面的学习会慢慢的深入,更加的体系化和全面化,希望对读者有益,当然文章风格是不会变的(想变没门)。回来哈,

OOM

我们知道java的对象是在堆中存储的,那如果我们的对象没有生命周期,不停的创建个不停创建个不停,会发生什么情况呢,没错,你会把jvm炸了,当然jvm是不会让你得逞的,他会在炸了的瞬间抛出异常终止所有程序的执行,避免造成更大范围的伤害,这个就是OOM

手动制造OOM

《java虚拟机规范》中交代了:java堆是内存不连续的区域,java堆是可扩展的(-xmx -xms),当java堆没有内存完成实例分配并且堆也不能扩展时就会抛out of memory error

我们可以通过-xmx-xms调整堆的大小,比如搞成20M,然后不断添加对象就OOM了,这里简单介绍,要看粉丝的呼声,我们可以认真搞一下,哈哈开个玩笑,很多时候我们要倾听我们内心的呼声。

如何分析解决

“谁中意星座话题,来告诉我哪一颗星该怎么搞定”,那遇到OOM,我们怎么搞定呢?常规的办法是可以先dump一个快照,然后使用内存分析工具进行内存分析,首要的目标是分析出是内存泄漏还是内存溢出?

内存泄漏

如果是内存泄漏,那我们就要看看对象为何无法回收,到底是谁在从中作梗啊(机智),那我们可以通过GCroots的引用链,看看泄漏对象怎么和它关联的,然后根据它的类型信息找到它的引用信息进而定位到创建对象的具体位置,坚决打击和防范这种偷税漏税的行为((义正言辞)!!!),具体细节先按下不表。

内存溢出

如果是内存溢出,那就要看看我们的配置,看对于机器内存来说,是否有向上调整的空间,再检查代码是否有生命周期过长、持有状态时间过长,设计不合理的情况。

题外话

昨天给妈妈推荐学习的视频,她说很好,并很安静的睡了......