JVM笔记 —— 出现内存溢出错误时时如何排查

news/2024/11/18 2:42:45/

一、出现内存溢出的几种情况

内存溢出错误分为StackOverflowError和OutOfMemoryError,前者是栈中出现溢出,后者一般是堆或方法区出现溢出,简称OOM

1. 栈溢出 StackOverflowError

栈溢出一般都是因为没有正确的结束递归导致的,无限递归导致超出栈内存(-Xss)限制时就会抛出StackOverflowError。这种情况直接根据异常信息定位到代码位置进行修正即可。
在这里插入图片描述
在这里插入图片描述

2. 方法区溢出 OOM

当方法区中加载的类过多,比如通过动态代理生成很多代理类或者热部署时热加载了过多的类,多到超出方法区内存限制时(-XX:MaxMetaspaceSize),会抛出OutOfMemoryError。但这种情况一般也比较少见,如果真出现这种情况可以考虑增加MetaspaceSize,或者拆分服务,使得一个服务使用的类不超出限制。

3. 堆溢出 OOM

其实大部分OOM都是发生在堆区,当堆中存储的对象过多,GC来不及回收或者回收不掉,没有足够空间创建新对象,就会抛出OutOfMemoryError。

java.lang.OutOfMemoryError: Java heap space

二、OOM排查思路

当堆区出现OOM时,就需要我们去进行排查,看什么对象把内存吃满了

  1. 第一步:我们需要拿到发生OOM时堆区的内存快照heap dump,这里面保存了某一时刻堆中对象的情况。heap dump有两种方式可以拿到。第一种就是我们预先在jvm进程启动时开启参数配置-XX:+HeapDumpOnOutOfMemoryError,-XX:HeapDumpPath=/usr/local/oom,当发生OOM时会自动生成heap dump保存在指定路径下,这也是推荐的方式。第二种方式是如果jvm进程没有被结束,可以用工具比如jdk自带的jvisualvm手动获取指定进程id的heap dump。
  2. 第二步:将拿到的heap dump导入到分析工具中,比如说MemoryAnalyzer,通过工具分析可以看到是哪些类型对象占用了大量内存及其GC引用链,还有错误栈等信息。
  3. 第三步:根据分析得到的信息到代码中进行排查,如果是代码逻辑有问题就改代码,比如不恰当的强引用导致的内存泄漏。如果代码逻辑没问题,确实需要占这么多内存,那就考虑提升堆内存大小(-Xms -Xmx)。

参考:
https://blog.csdn.net/qq_31363843/article/details/117038001
https://blog.csdn.net/weixin_41010294/article/details/104009722


http://www.ppmy.cn/news/1022535.html

相关文章

题目:2520.统计能整除数字的位数

​​题目来源: leetcode题目,网址:2520. 统计能整除数字的位数 - 力扣(LeetCode) 解题思路: 逐位判断即可。 解题代码: class Solution {public int countDigits(int num) {int res0;int ori…

Vc - Qt - QToolButton

QToolButton 是 Qt 框架中的一个类,是 QPushButton 的子类。它可以显示一个可单击的按钮,并且可以与弹出菜单、图标和文本等进行关联。 QToolButton的一些常见特性和用法包括: 设置文本:使用 setText() 函数设置按钮上的文本。设置…

12 | B站视频播放量分析

本次探讨将聚焦于B站视频播放量的深度分析,从不同角度解读播放量背后所蕴含的意义,剖析其受影响因素,并探讨播放量对内容创作者和平台发展的重要意义。让我们一同走进数据的世界,解码播放量的奥秘,探寻数字背后的故事。 # 本案例中大部分绘图使用序列化后数据;相应序列化…

探索人工智能 | 智能推荐系统 未来没有人比计算机更懂你

前言 智能推荐系统(Recommendation Systems)利用机器学习和数据挖掘技术,根据用户的兴趣和行为,提供个性化推荐的产品、内容或服务。 文章目录 前言核心机器学习为什么说机器学习是智能推荐系统的基础呢? 数据挖掘数据…

储能pcb的布局注意事项与制造难点

随着新能源需求的不断增长和能源结构的转型,储能技术的市场规模不断扩大。储能PCB作为储能系统中电池模块的重要组成部分,对整个系统的安全性和性能起到关键作用。今天我们就来聊聊,储能pcb有什么特征。 什么是储能:储能是指能量…

【Ajax】回调地狱解决方法

回调地狱(Callback Hell)是指在异步编程中,特别是在嵌套的回调函数中,代码变得深度嵌套、难以阅读和维护的现象。这通常发生在处理多个异步操作时,每个操作都依赖于前一个操作的结果。回调地狱使代码变得难以理解、扩展…

Declare 关键字在 TypeScript 中如何正确使用?

如果您编写 TypeScript 代码的时间足够长,您就已经看到过declare关键字。但它有什么作用,为什么要使用它? declare关键字告诉 TypeScript 编译器存在一个对象并且可以在代码中使用。 本文解释了声明关键字并通过代码示例展示了不同的用例。 定义 在 TypeScript 中,decl…

基于Spring Boot的招聘网站的设计与实现(Java+spring boot+MySQL)

获取源码或者论文请私信博主 演示视频: 基于Spring Boot的招聘网站的设计与实现(Javaspring bootMySQL) 使用技术: 前端:html css javascript jQuery ajax thymeleaf 微信小程序 后端:Java springboot框…