JVM OOM问题排查与解决思路

news2024/11/19 16:42:59

OOM原因

1. 堆溢出

报错信息:

java.lang.OutOfMemoryError: Java heap space

  1. 代码中可能存在大对象分配,无法获得足够的内存分配

  2. 可能发生内存泄露,导致内存被无效占用以至于耗尽

2. 永久代/元空间溢出

报错信息:

java.lang.OutOfMemoryError: PermGen space
java.lang.OutOfMemoryError: Metaspace

  1. 在Java7之前,频繁的使用String.intern()方法

  2. 代码中存在大量的反射操作,导致方法区被撑爆,无法卸载

3. 方法栈溢出

报错信息:

java.lang.OutOfMemoryError : unable to create new native Thread

每个 Java 线程都需要占用一定的内存空间,当 JVM 向底层操作系统请求创建一个新的 native 线程时,如果没有足够的资源分配就会报此类错误。出现这种异常,基本上都是创建的了大量的线程导致的。

4. swap溢出

报错信息 :

java.lang.OutOfMemoryError: Out of swap space

这种情况一般是操作系统导致的,可能的原因有:

  1. swap 分区大小分配不足;

  2. 其他进程消耗了所有的内存。

5. 本地方法溢出

报错信息 :

java.lang.OutOfMemoryError: stack_trace_with_native_method

本地方法在运行时出现了内存分配失败,和之前的方法栈溢出不同,方法栈溢出发生在 JVM 代码层面,而本地方法溢出发生在JNI代码或本地方法处。

6. GC overhead limit exceeded

报错信息:

java.lang.OutOfMemoryError:GC overhead limit exceeded

超过98%的时间用来做GC并且回收了不到2%的堆内存时会抛出此异常。

  1. 项目中可能有大量的死循环或有使用大内存的代码
  2. 存在内存泄露

7. Requested array size exceeds VM limit

报错信息:

java.lang.OutOfMemoryError: Requested array size exceeds VM limit

JVM 限制了数组的最大长度,该错误表示程序请求创建的数组超过最大长度限制。

8. Direct buffer memory

报错信息:

java.lang.OutOfMemoryError: Direct buffer memory

Direct ByteBuffer 的默认大小为 64 MB,一旦使用超出限制,就会抛出此错误。

JVM监控工具介绍

1. jps命令

显示指定系统内所有的java虚拟机系统

  • -l:输出进程ID和应用主类的完整路径;
  • -v:输出向jvm传递的参数,此处展示为idea中显式配置的VM-options参数,其他内容自行查看即可;
  • -m:输出向main方法传递的参数,服务启动前可以在idea的Program-arguments配置;

2. jinfo命令

查看和调整虚拟机参数。在命令后面带pid进程号,可以输出指定进程的配置信息。

  • -sysprops:输出 Java System Properties 参数;
  • -flags:输出 VM Flags 参数;

3. jstat命令

输出JVM的监控指标

  • -gc:输出java堆相关信息;
  • -gcutil:输出java堆各个区域使用百分比;

4. jstack命令

输出指定进程当前时刻在JVM中的线程信息

5. jmap命令

输出指定进程的内存中对象映射信息,或者堆的关键信息、内存的使用统计、GC算法、配置、类的实例信息及内存占用等

  • -heap:输出java堆详细信息;
  • -dump:输出java堆内存快照;

6. jconsole

Java内置的JVM性能监控工具,在熟悉上述的命令行工具之后,对于该可视化工具的使用不会太陌生,在命令中可以查看到的默认参数或者应用自定义配置,在该工具中也可以找到,并且以图形化的方式呈现;

7. jvisualvm

VisualVM 提供了一个可视界面,用于查看JVM上运行的基于 Java 技术的应用程序的详细信息。可以查看本地应用程序或远程主机上运行的应用程序的相关数据。此外,还可以捕获有关 JVM 软件实例的数据,并将该数据保存到本地系统,以供后期查看或与其他用户共享。

通过jvisualvm定位OOM问题

获取dump文件

注意导出文件占用内存很大的时候,可能会导不出来

  • 方式一:提前配置jvm参数,在系统挂了后会在指定目录下生成dump文件

    -XX:+HeapDumpOnOutOfMemoryError

    -XX:HeapDumpPath=./ (导出路径)

  • 方式二:使用命令行导出

    jmap -dump:format=b,file=demo.hprof pid

通过jvisualvm工具装载dump文件

查看内存占用最高的业务对象,并找到GCRoot并查看线程栈从而定位问题
在这里插入图片描述
在这里插入图片描述

通过Arthas工具定位问题

执行如下命令下载arthas-boot.jar,再用java -jar命令启动:

wgethttps://arthas.aliyun.com/arthas-boot.jar; java-jararthas-boot.jar

arthas-boot是Arthas的启动程序,它启动后,会列出所有的Java进程,用户可以选择需要诊断的目标进程。

使用dashboard 命令可以查看当前系统的实时数据面板。可以查看到CPU、内存、GC、运行环境等信息。
在这里插入图片描述

使用 sc 命令来查找JVM里已加载的类,通过-d参数,可以打印出类加载的具体信息,很方便查找类加载问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/418971.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python黑马程序员(Spark实战)笔记

1、基础准备 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyspark # 导包 from pyspark import SparkConf,SparkContext #创建SparkConf类对象 confSparkConf().setMaster("local[*]").setAppName("test_spark_app") #基于SparkXConf类对象创…

(十一)排序算法-选择排序

1 基本介绍 选择排序也属于内部排序法,是从欲排序的数据中,按指定的规则选出某一元素,再依规定交换位置后达到排序的目的。 动画展示: 选择排序思想: 选择排序(select sorting)也是一种简单的…

【刷题篇】栈和队列

目录 一.前言🌈 二.有效的括号✨ a.题目 b.题解分析 c.AC代码 三. 用队列实现栈📏 a.题目 b.题解分析(辅助队列法) c.AC代码(辅助队列法) d.题解分析(就地存储法) c.AC代…

全面带你了解AIGC的风口

前言 一、AIGC的介绍 二、AIGC 的几个主要作用 三、实现AIGC过程的步骤 四、科技新赛道AIGC开始火了 五、AIGC对世界产生广泛的影响 六、AIGC技术的主要风口 😘一、AIGC的介绍 AIGC (AI Generated Content) 是指通过人工智能技术生成的各种类型的内容,…

SpringBoot学习3

一、JSR303数据验证 使用Validated进行数据验证,如果数据异常则会统一抛出异常,方便异常中心统一处理。 空检查 Null 对象为null NotNull 对象不能为 null,但可以是 空字符串(无法检验长度为0的字符串) NotBlank 检查约束字符串是不是为nul…

20230403在WIN10下通过ffmpeg调用NVIDIA的硬件加速wmv视频转码为MP4格式

20230403在WIN10下通过ffmpeg调用NVIDIA的硬件加速wmv视频转码为MP4格式 2023/4/3 15:50 最近向学习日语,找到日语发音的视频中,大多数是MP4格式,少量是WMV格式,PR2023貌似不能识别WMV格式。 于是:万能的ffmpeg上场了&…

使用GPT-4生成QT代码

一、概述最近ChatGPT火爆起来了,ChatGPT是一种基于GPT的自然语言处理模型,可以用于生成自然语言文本,例如对话、文章等。最近又发现了一个优秀且免费的代码生成工具Cursor ,Cursor集成了 GPT-4 ,可以帮助你快速编写、编…

动态规划:状态机DP和买卖股票问题【零神基础精讲】

买卖股票的最佳时机:无限次/冷冻期/k次【基础算法精讲 21】 来自0x3f:https://www.bilibili.com/video/BV1ho4y1W7QK/ 介绍了【买卖股票系列问题】与【状态机 DP】,包括【至多/恰好/至少】的讲解。 文章目录买卖股票问题和状态机DP(无限次)[1…

【CocosCreator入门】CocosCreator组件 | DragonBones(骨骼动画)组件

Cocos Creator 是一款流行的游戏开发引擎,具有丰富的组件和工具,其中DragonBones,它可以帮助您创建出色的2D骨骼动画。在本文中,我们将探讨CocosCreator引擎的DragonBones组件,以及如何使用它来创建精美的动画。 目录 …

VisualGC插件使用

下载安装VisualVM 下载地址:Visual VM mac系统选择macOS Application Bundle,下载完成后,双击dmg包安装即可,之后双击启动。 安装Visual GC 插件 点击菜单栏Tools,选择Pulgins,在第二个选项中找到Visua…

【CSS】更改用户界面样式 ③ ( 取消文本域拖拽 | 代码示例 )

文章目录一、取消文本域拖拽二、文本域拖拽示例三、取消文本域拖拽示例一、取消文本域拖拽 textarea 文本域 在 默认状态下是可以进行拖拽的 , 在网页布局中 , 一般不会允许这种情况发生 , 任意拖拽文本域会影响网页的整体布局 ; 设置文本域不可拖拽样式 : resize: none;文本…

windows编程(4) - GDI绘图基础

基础概念 GDI:Graphic Device Interface 图形设备接口。GUI:Graphic User Interface 图形用户接口。HDC:Handle of Device Context: 图形设备上下文句柄。 字符界面的基本单位是字符。 图形界面的基本单位是像素。 像素&#…

从数据展示中汉字缺失了解字符编码知识

有人在使用皕杰报表时遇到如下问题: 有些汉字变成了“?”,这是为什么呢?实际上就是你用的字符集里没有这个汉字导致的,要想搞懂这个问题,还得从字符、字符集、字符编码说起。 所谓字符,就是各…

定时任务练习----Linux 定时发送邮件 ( QQ 邮箱 为例)

邮件设置 : 在 QQ 邮箱的最上面 ,点击设置。 在账户 这一栏,往下面走 找POP3 开头的栏目 在 POP3/SMTP 服务这一行,点击开启 ( 本身是 关闭状态 ) 关于 POP3 和 SMTP 服务需要做以说明 ; >>> 我…

技术管理笔记1

看点杂篇,整理下笔记: 目录: 1技术的本质 2 技术团队管理的本质 3 技术管理者的能力要求 4 技术管理者风格类型 5 实战案例分析: 一技术的本质 技术存在感低,缺乏话语权,以业务导向为主。 二 技术团…

Spring Cloud第二季--OpenFeign和Feign

文章目录一、Feign二、Feign和OpenFeign的区别三、案例测试1、eureka注册中心集群7001/70022、两个微服务3、OpenFeign一、Feign Spring Cloud Feign的介绍在Spring Cloud学习–声明式调用(Feign)中详细介绍。 简单回顾下,Feign是一个声明式…

UTF-8(Unicode Transformation Format)

文章目录一、Unicode示例代码:二、网络传输与Unicode三、UTF-8如何编码四、使用UTF-8转换传输Unicode五、利用Java-API进行UTF8编码和解码六、利用代码输出Unicode编码和UTF8编码七、手写UTF8编码、解码八、总结UTF8一、Unicode 示例代码: package demo…

【Ubuntu安装选项】

关于Ubuntu系统安装选项 [TOC](关于Ubuntu系统安装选项) 安装选项选择 一、*Try or Install Ubuntu 二、Ubunru (safe graphics) 三、OEM install (for manufacturers) 四、Test memory 总结 安装选项选择 在安装Ubuntu系统时会有四个选项,搜…

模型部署学习--有三AI(视频要收费So没学完)

视频地址:深度学习之模型部署 模型的整个使用流程 从模型训练到部署 一 部署平台选择: 1、在线服务器端部署,精度优先: 大模型/分布式(如千亿级参数模型GPT-3) 延迟不敏感(如以图搜图应用&am…

chatgpt批量写作-chatgpt批量生成文章

cchatgpt写作 ChatGPT是一种基于Transformer架构的自然语言处理技术,它可以用于文本生成和对话场景,可以辅助写作、创作等任务。以下是一些使用ChatGPT进行写作的方法和技巧: Fine-tuning预训练模型:ChatGPT模型预训练时需要大量…