JVM OOM问题排查与解决思路

2023-11-16

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参数,可以打印出类加载的具体信息,很方便查找类加载问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JVM OOM问题排查与解决思路 的相关文章

  • 菜单未显示在应用程序中

    由于某种原因 我的操作菜单在我的 Android Studio 应用程序中消失了 我正在按照教程学习如何创建 Android 应用程序 但最终遇到了这个问题 我正在使用 atm 的教程 http www raywenderlich com
  • 在 JTable 中移动行

    我使用 MVC 模式 并且有一个如下所示的 JTable List
  • 我需要在 Spring 中检查每个控制器中的有效会话吗? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 假设在 Spring Mvc 的 Web 应用程序中 我们是否需要检查每个控制器或 jsps 中的有效会话 我该如何解决 MVC 中的
  • 在Windows上安装Java 11 OpenJDK(系统路径问题)

    Java 11 最近发布了 众所周知 这个版本没有安装文件 当然 要在没有安装程序的情况下安装 Java 我将系统设置 PATH 和 JAVA HOME 设置为解压缩 Java 11 的文件夹的地址 根据对类似问题的已接受回复建议 唯一的事
  • 如何查找 Android 设备中的所有文件并将它们放入列表中?

    我正在寻求帮助来列出 Android 外部存储设备中的所有文件 我想查找所有文件夹 包括主文件夹的子文件夹 有办法吗 我已经做了一个基本的工作 但我仍然没有得到想要的结果 这不起作用 这是我的代码 File files array file
  • Java8无符号算术

    据广泛报道 Java 8 具有对无符号整数的库支持 然而 似乎没有文章解释如何使用它以及有多少可能 有些函数 例如 Integer CompareUnsigned 很容易找到 并且似乎可以实现人们所期望的功能 但是 我什至无法编写一个简单的
  • 无法理解 Java 地图条目集

    我正在看一个 java 刽子手游戏 https github com leleah EvilHangman blob master EvilHangman java https github com leleah EvilHangman b
  • 迁移到 java 17 后有关“每个进程的内存映射”和 JVM 崩溃的 GC 警告

    我们正在将 java 8 应用程序迁移到 java 17 并将 GC 从G1GC to ZGC 我们的应用程序作为容器运行 这两个基础映像之间的唯一区别是 java 的版本 例如对于 java 17 版本 FROM ubuntu 20 04
  • Spring Data 与 Spring Data JPA 与 JdbcTemplate

    我有信心Spring Data and Spring Data JPA指的是相同的 但后来我在 youtube 上观看了一个关于他正在使用JdbcTemplate在那篇教程中 所以我在那里感到困惑 我想澄清一下两者之间有什么区别Spring
  • 反思 Groovy 脚本中声明的函数

    有没有一种方法可以获取 Groovy 脚本中声明的函数的反射数据 该脚本已通过GroovyShell目的 具体来说 我想枚举脚本中的函数并访问附加到它们的注释 Put this到 Groovy 脚本的最后一行 它将作为脚本的返回值 a la
  • Java直接内存:在自定义类中使用sun.misc.Cleaner

    在 Java 中 NIO 直接缓冲区分配的内存通过以下方式释放 sun misc Cleaner实例 一些比对象终结更有效的特殊幻像引用 这种清洁器机制是否仅针对直接缓冲区子类硬编码在 JVM 中 或者是否也可以在自定义组件中使用清洁器 例
  • org.jdesktop.application 包不存在

    几天以来我一直在构建一个 Java 桌面应用程序 一切都很顺利 但是今天 当我打开Netbeans并编译文件时 出现以下编译错误 Compiling 9 source files to C Documents and Settings Ad
  • Tomcat 6找不到mysql驱动

    这里有一个类似的问题 但关于类路径 ClassNotFoundException com mysql jdbc Driver https stackoverflow com questions 1585811 classnotfoundex
  • 使用 SAX 进行 XML 解析 |如何处理特殊字符?

    我们有一个 JAVA 应用程序 可以从 SAP 系统中提取数据 解析数据并呈现给用户 使用 SAP JCo 连接器提取数据 最近我们抛出了一个异常 org xml sax SAXParseException 字符引用 是无效的 XML 字符
  • 将 JTextArea 内容写入文件

    我在 Java Swing 中有一个 JTextArea 和一个 提交 按钮 需要将textarea的内容写入一个带有换行符的文件中 我得到的输出是这样的 它被写为文件中的一个字符串 try BufferedWriter fileOut n
  • android Accessibility-service 突然停止触发事件

    我有一个 AccessibilityService 工作正常 但由于开发过程中的某些原因它停止工作 我似乎找不到这个原因 请看一下我的代码并告诉我为什么它不起作用 public class MyServicee extends Access
  • 如何修复“sessionFactory”或“hibernateTemplate”是必需的问题

    我正在使用 Spring Boot JPA WEB 和 MYSQL 创建我的 Web 应用程序 它总是说 sessionFactory or hibernateTemplate是必需的 我该如何修复它 我已经尝试过的东西 删除了本地 Mav
  • com.jcraft.jsch.JSchException:身份验证失败

    当我从本地磁盘上传文件到远程服务器时 出现这样的异常 com jcraft jsch JSchException Auth fail at org apache tools ant taskdefs optional ssh Scp exe
  • JAVA - 如何从扫描仪读取文件中检测到“\n”字符

    第一次海报 我在读取文本文件的扫描仪中读取返回字符时遇到问题 正在读取的文本文件如下所示 test txt start 2 0 30 30 1 1 90 30 0 test txt end 第一行 2 表示两个点 第二行 位置索引 0 xp
  • Swagger/Openapi-Annotations:如何使用 $ref 生成 allOf?

    我正在生成 Rest 端点 包括添加OpenAPI Swagger对生成的代码进行注释 虽然它对于基本类型运行得很好 但我在自定义类方面遇到了一些问题 现在我有很多自定义类的重复架构条目 使用 Schema 实现 MyClass class

随机推荐

  • 如何在Linux下配置nginx以及docker环境

    nginx环境的配置 环境准备 编译 php fpm环境的搭建 docker环境的配置 什么是docker 在linux中安装docker nginx环境的配置 环境准备 我这里使用的是 centos7 以下操作都是在这个环境下进行执行的
  • JavaScript 逆向调试常用技巧

    1 断点调试 接下来介绍一个非常重要的功能 断点调试 在调试代码的时候 我们可以在需要的位置上打断点 当对应事件触发时 浏览器就会自动停在断点的位置等待调试 此时我们可以选择单步调试 在面板中观察调用栈 变量值 以更好地追踪对应位置的执行逻
  • 100个python算法超详细讲解:分糖果

    1 问题描述 10个小孩围成一圈分糖果 老师分给第1个小孩10块 第2个小孩2块 第3个小 孩8块 第4个小孩22块 第5个小孩16块 第6个小孩4块 第7个小孩10块 第8个小 孩6块 第9个小孩14块 第10个小孩20块 然后所有的小孩
  • 【AI视野·今日CV 计算机视觉论文速览 第215期】Tue, 8 Jun 2021

    AI视野 今日CS CV 计算机视觉论文速览 Tue 8 Jun 2021 showing first 100 of 133 entries Totally 100 papers 上期速览 更多精彩请移步主页 Daily Computer
  • 一文了解语音合成技术(TTS)

    TTS是Text To Speech的缩写 即 从文本到语音 它将计算机自己产生的 或外部输入的文字信息转变为可以听得懂的 流利的汉语口语 或者其他语言语音 输出的技术 隶属于语音合成 SpeechSynthesis 语音 在人类的发展过程
  • 关于深度残差网络(Deep residual network, ResNet)

    深度残差网络 深度残差网络的设计就是为了克服这种由于网络深度加深而产生的学习效率变低 准确率无法有效提升的问题 也称为网络退化 甚至在一些场景下 网络层数的增加反而会降低正确率 这种本质问题是由于出现了信息丢失而产生的过拟合问题 overf
  • conda --init 问题

    初始化编译软件出现下面问题 vscode Windows Visual Studio 2017 Developer Command Prompt v15 9 45 Copyright c 2017 Microsoft Corporation
  • vue2项目window.open打开一个新窗口刷新总回到首页(重定向页面)

    问题描述 使用window open打开新窗口跳转本系统的某一个页面 如 http 192 168 1 206 9529 previewScreen idx 1653966398075965442 刷新总是回到首页 找了很久也没找到解决办法
  • QLExpression学习使用教程

    文章目录 QLExpress 简介 支持特性 Maven引入 例子github源码 图分解 提示 例子 初次使用 Runner执行器设置 执行器执行命令的设置 支持普通的Java语法执行 运算符支持 运算符分类 示例 部分运算符列举 样例使
  • 远控与文件传输

    由于目前工作用到了win10 win7 ubuntu kali等系统 而且考虑到之后出差或者远程办公等 所以打算用我最新的ipad pro连接计算机 这样尽量减少每次背着电脑和ipad等一堆设备 远控与文件传输 1 局域网下电脑文件互传 2
  • 详解Java四大作用域

    文章目录 四大作用域 1 pageContext 1 1定义 2 request 详解 2 1定义 2 2 request域对象的使用 2 3生命周期 2 4 获取请求头数据 3 session 详解 3 1定义 3 2 获取session
  • VSCode Java 开发配置

    本文将介绍如何使用VSCode配置Java开发环境 读者可以通过链接 打开进入到下载页面 读者需要选择自己的操作系统进行下载 下载完成后在操作系统中将其安装 安装完成后打开VSCode软件 首次进入VSCode界面如图所示 VSCode作为
  • [激光原理与应用-62]:激光器 - 光学 - 怎样测量光斑和光束质量?

    目录 一 概述 二 光强分布 三 光束直径 四 光束相机 五 M 因子测量 六 束腰以及大小 七 发散角 八 正态分布 高斯分布 其他概念 一 概述 激光的直径和光强度分布可通过光束轮廓分析仪测量 但为了判定光束质量 还需要加上M 测量扩展
  • 【mac】Obsidian手动安装插件-多端同步

    手动插件安装 porxy github 这个插件是专门解决 无法加载插件市场的 先在github中打开链接 github上教了方法 下载zip文件 解压后 插入到 obsidian plugins文件夹内 一般来讲 小白刚安装的时候难免找不
  • CentOS7 Hive2.3.9 安装部署(mysql 8.0)

    一 CentOS7安装MySQL数据库 查询载mariadb rpm qa grep mariadb 卸载mariadb rpm e nodeps 查询出来的内容 安装wget为下载mysql准备 yum y install wget 在t
  • mysql alter的用法--修改表,字段等信息

    一 修改表信息 1 修改表名 修改表名为studen1 alter table student rename to student1 2 修改表注释 修改表注释 alter table student comment 学生表 二 修改字段信
  • Python-字典合并

    方法1 使用update方法 第二个参数合并第一个参数 def merge dict1 dict2 return dict2 update dict1 两个字典 dict1 a 10 b 8 dict2 d 6 c 4 返回None pri
  • Python入门必背代码大全

    前言 Python作为一门简洁而强大的编程语言 广泛应用于数据分析 Web开发 人工智能等领域 本文将为您整理一份Python入门必背的代码大全 帮助您掌握常用的Python代码片段 快速入门并提升编程技能 一 基本语法和数据类型操作 打印
  • C++的类与对象

    类的概念 类是将不同类型的数据和处理这些数据的操作封装在一起的一个复合数据类型 类有两类成员 一类是数据成员 用于表示实体抽象的属性 另一类是成员函数 用来描述实体抽象的行为 类作为一种数据类型 在定义的时候是不分配内存的 类通过将数据和对
  • JVM OOM问题排查与解决思路

    OOM原因 1 堆溢出 报错信息 java lang OutOfMemoryError Java heap space 代码中可能存在大对象分配 无法获得足够的内存分配 可能发生内存泄露 导致内存被无效占用以至于耗尽 2 永久代 元空间溢出