Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >老公:怎么排查堆内存溢出啊?

老公:怎么排查堆内存溢出啊?

作者头像
敖丙
发布于 2020-05-25 10:54:00
发布于 2020-05-25 10:54:00
1.1K00
代码可运行
举报
文章被收录于专栏:三太子敖丙三太子敖丙
运行总次数:0
代码可运行

你知道的越多,你不知道的越多

上次给老公们说过了死循环cpu飙高的排查过程,今天就带着老公们看看堆内存溢出我们一般怎么排查的。

  • cpu100%排查文章

在排查之前,我想jvm的基础知识大家应该都是了解了的吧?

老婆我就是不了解,人家要你说给我听。

行行行,诶真实拿你们没办法,那我就带大家回温一下JVM的内存模型(这玩意跟JAVA内存模型JMM可不一样,不要记错了)

今天我就直说堆,因为溢出是发送在堆中的。

JVM堆内存被分为两部分:年轻代(Young Generation)和老年代(Old Generation)。

年轻代

年轻代是所有新对象产生的地方。当年轻代内存空间被用完时,就会触发垃圾回收。这个垃圾回收叫做Minor GC。

年轻代被分为3个部分——Enden区和两个Survivor区。

年轻代空间的要点:
  1. 大多数新建的对象都位于Eden区。
  2. 当Eden区被对象填满时,就会执行Minor GC,并把所有存活下来的对象转移到其中一个survivor区。
  3. Minor GC同样会检查存活下来的对象,并把它们转移到另一个survivor区。这样在一段时间内,总会有一个空的survivor区。
  4. 经过多次GC周期后,仍然存活下来的对象会被转移到年老代内存空间,通常这是在年轻代有资格提升到年老代前通过设定年龄阈值来完成的。

年老代

年老代内存里包含了长期存活的对象和经过多次Minor GC后依然存活下来的对象,通常会在老年代内存被占满时进行垃圾回收。

GC种类

Major GC

老年代的垃圾收集叫做Major GC,Major GC通常是跟full GC是等价的,收集整个GC堆。

分代GC
  1. Young GC:只收集年轻代的GC
  2. Old GC:只收集年老代的GC(只有CMS的concurrent collection是这个模式)
  3. Mixed GC:收集整个young gen以及部分old gen的GC(只有G1有这个模式)
Full GC

Full GC定义是相对明确的,就是针对整个新生代、老生代、元空间(metaspace,java8以上版本取代perm gen)的全局范围的GC。

老公们可以从上图看到年轻代分为了一个Eden区和两个survivor区(S1,S2),survivor区同一时间只会有一个满一个空,交替的。

然后就是GC到一定的阈值到老年代,今天不讲永久代所以忽略Mataspace。

老婆:那怎么分析呢?

今天我就用一个JDK自带的工具jvisualvm来给大家演示一波怎么操作的,因为这玩意谁都有,你去命令行敲一下jvisualvm就出来了(Mac是这样的,不知道Windows是怎么样子的)。

操作界面:

一般什么情况可能是出现了溢出呢?

超时,不进行服务,服务挂掉,接口不在服务这样的异常问题。

那模拟也很简单,我写个循环一直往List丢数据,不使用list就能看到现象了

老公们可以看到图形化界面还是很清晰明了的,这个是Visual GC的插件

大家点击菜单栏的插件,然后安装就好了,安装完了记得点击激活。

可以看到不释放,堆空间就一直上去,直到OOM(out of memory)

这个时候我们就dump下来堆信息看看

会dump出一个这样的hprof快照文件,可以用jvisualvm本身的系统去分析,我这里推荐MAT吧,因为我习惯这个了。

MAT :下载地址

下来好了我们可以看到mat已经分析了我们的文件

你看他就是个暖男,都帮我们分析出来了一个问题,我们点进去看看

他发现了是ArrayList的问题了,我们再往下看看

看到了嘛,具体代码的位置都帮我们定位好了,那排查也就是手到擒来的事情了。

延伸点

上面我们使用工具jump了,那怎么去服务器上jump呢?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
jmap -dump:format=b,file=<dumpfile.hprof> <pid>

有老公可能问了,不是所有的故障当时我们都在场的,无法及时jump,那也简单

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-XX:+HeapDumpOnOutOfMemoryError

配置这玩意之后,oom的时候会自动jump的,到时候拿快照分析一波就好了。

MAT的功能还有很多的,百度谷歌太多工具文了,我就不做重复的工作了,比如还可以排查对象的强弱引用,还可以查看引用链等等。

还有个只写这么点的原因是有点晚了,顶不住了,最近不拍视频也是因为事情多了,有点小忙,希望老公们体量,对了Redis的分布式锁已经在安排的路上了。

我是敖丙,一个在互联网苟且偷生的工具人。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 敖丙 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
JVM
重学Java系列之深入理解JVM虚拟机6:JNDI,OSGI,Tomcat类加载器实现
hhss
2021/02/12
6800
JVM
春招金三银四的高频JVM面试题
为什么划分老年代和新生代,主要对象大小不一样,对象生命周期不一样。划分后,提供垃圾回收效率,节省资源,提升对象利用率等等。
猫头虎
2024/04/08
1120
春招金三银四的高频JVM面试题
Java堆内存设置
Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。
码客说
2020/05/09
3.4K0
Java堆内存又溢出了!看大师如何防范
JAVA堆内存管理是影响性能主要因素之一。 堆内存溢出是JAVA项目非常常见的故障,在解决该问题之前,必须先了解下JAVA堆内存是怎么工作的。
慕容千语
2019/06/11
1.5K0
JVM真香系列:堆内存详解
在 JVM中,堆被划分成两个不同的区域:新生代 ( Young )、老年代 ( Old )。
田维常
2020/11/19
5550
JVM真香系列:堆内存详解
三分钟搞明白Java内存分布,再也不怕了!!!
做Java的大都没有c++ 的那种分配内存的烦恼,因为Java 帮我们管理内存,但是这并不代表我们不需要了解Java的内存结构,因为线上经常出现内存的问题,今天聊一下内存的问题。
香菜聊游戏
2021/06/02
5140
JVM参数汇总:JVM内存设置多大合适?Xmx和Xmn如何设置?[通俗易懂]
链接:[#link]( https://www.cnblogs.com/duanxz/p/3482366.html )
全栈程序员站长
2022/08/01
34.5K0
JVM参数汇总:JVM内存设置多大合适?Xmx和Xmn如何设置?[通俗易懂]
JVM垃圾回收之垃圾收集算法,程序员必须掌握的知识
解释下,堆大小=新生代+老年代,新生代与老年代的比例为1:2,新生代细分为一块较大的Eden空间和两块较小的Survivor空间,分别被命名为from和to。
黎明大大
2020/09/08
4250
JVM垃圾回收之垃圾收集算法,程序员必须掌握的知识
JVM内存管理
Java内存管理是一项持续的挑战,同时也是锻造出可拓展应用的必备技能。本质上,Java内存管理就是一个为新对象分配内存和释放无用对象内存的过程。
码代码的陈同学
2018/06/03
2.3K0
JVM内存管理
面试必会:JVM堆内存详解
年轻代中包含两个区:Eden 和survivor,并且用于存储新产生的对象,其中有两个survivor区
公众号 IT老哥
2020/09/16
1.2K0
面试必会:JVM堆内存详解
java(9)-深入浅出GC垃圾回收机制
1、本文了解GC垃圾回收机制,深入理解GC后才明白,为啥FGC会导致stop-the-world。 2、了解GC算法。
黄规速
2022/04/14
1K0
java(9)-深入浅出GC垃圾回收机制
JVM堆内存导致的FGC问题排查
Survivor Memory spaces (S0, S1): 幸存区,发生minor gc时,幸存区的对象全部复制到另一个里面去。
凯哥的Java技术活
2022/12/18
1.2K0
JVM堆内存导致的FGC问题排查
JVM的内存管理(堆内存)
也称heap堆区。堆是jvm内存中占用空间最大的一个区域。主要分为新生代、老年代、永久代(jdk1.8以后叫元空间,到1.9以后又被移除)
用户7410760
2024/12/14
2320
JVM的内存管理(堆内存)
Java垃圾回收器与内存分配策略
上一篇JVM内存模型讲述了Java虚拟机在运行时所管理的内存划分下的每个数据区域的各自用途,以及创建和销毁时间。当需要排查各种内存泄漏、内存溢出问题时,当来及收集成为系统达到更高并发量的瓶颈时,我们需要对JVM的GC机制和内存分配又更多的了解,这边文章是在上一篇文章的基础之上讲述了Java垃圾回收器与内存分配策略。
静默加载
2020/05/29
9430
五位卷王 | 总结的十道 JVM 面试真题!(建议收藏)
先说下哈,这次给大家带来的大厂面试题,都来源于我的知识星球,由星球的几位嘉宾 + 我 一起完成。
悟空聊架构
2022/05/13
4970
五位卷王 | 总结的十道 JVM 面试真题!(建议收藏)
JVM的4种垃圾回收算法、垃圾回收机制与总结[通俗易懂]
JVM的4种垃圾回收算法、垃圾回收机制与总结 – 知乎 https://zhuanlan.zhihu.com/p/54851319
全栈程序员站长
2022/11/07
11.6K0
JVM的4种垃圾回收算法、垃圾回收机制与总结[通俗易懂]
GC原理介绍、排查FGC及线上故障的步骤
JAVA堆分为新生代(Young Generation)和老年代(Old Generation)( 也就是图中对应的New Generation 和 tenured Generation)用于存储对象实例。
chenchenchen
2022/03/09
4.7K0
GC原理介绍、排查FGC及线上故障的步骤
【JVM进阶之路】十:JVM调优总结
JVM调优听起来很高大上,但是要认识到,JVM调优应该是Java性能优化的最后一颗子弹。
三分恶
2021/04/13
16.1K0
2.2 堆在整个jvm内存中的运行流程以及jvisualvm工具的使用
----------------------------------------------------------------
用户7798898
2020/09/27
1.1K0
2.2 堆在整个jvm内存中的运行流程以及jvisualvm工具的使用
【Java面试题1】简单说说JVM堆的内存结构和GC回收流程
我们在Java面试中,只要是2年以上经验,一定会问你一下关于JVM方面的问题。开发两年时间不能对JVM没有了解,如果你还不了解,说明你的学习与探索能力不高,不能给到应有的加分项哦!小编也是最近刚刚开始学习,总结一下最近的学习成果。方便以后看,也希望小伙伴们看到可以帮助到您!
掉发的小王
2022/07/11
2300
【Java面试题1】简单说说JVM堆的内存结构和GC回收流程
相关推荐
JVM
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验