当前位置: 首页 > news >正文

JDK8使用Visual VM根据Dump文件排查OutOfMemoryError生产问题思路

文章目录

  • 1. 前言
  • 2. 堆内存溢出
  • 3. GC执行异常
  • 4. 元空间内存溢出
  • 5. 创建线程异常
  • 6. 内存交换问题
  • 7. 数组长度过大
  • 8. 系统误杀异常

1. 前言

当系统异常产生了dump文件需要我们对其进行排查时,其本质上考验的是我们对于Java运行时内存结构的知识掌握是否牢固以及对业务代码的熟悉程度。其次不要觉得这是一件很有技术含量高大上的事情,只要工具会用,对一般的异常有基本的判断,大部分有点经验的开发都能胜任这个事情。

分析dump文件使用最多的便是Eclipse的MAT工具或Java自带的Visual VM,更加推荐使用Visual VM来进行排查,毕竟是官方的工具,只要安装了JDK就会有,并且基本能满足正常的排查要求。

很多开发平时很少有机会根据dump文件排查生产问题,因此总觉得这个事情比较虚,且没有好的工具去实现,其实Java官方提供的Visual VM就能满足大部分场景,基本足以解决日常需要。但前提是要学会使用导出Dump文件命令,以及在程序的启动参数上增加异常自动生成dump文件的配置。

使用Visual VM排查时,使用类实例数、大小属性和查看堆线程统计三个功能基本就能确定是哪些类或对象过多导致内存溢出,最后再去代码中看这些类在哪些地方会频繁使用创建基本就能解决大部分问题。当我们在使用第三方框架时,一些框架的标识最好能够在对象中体现,这样能够帮助我们更快的更为是哪些功能有问题。

Visual VM的使用比较简单,在这里不做过多阐述。

2. 堆内存溢出

异常日志:

Java heap space

堆内存异常是比较常见的,毕竟Java的所有数组和对象分配都是在堆上进行的。

一般堆内存溢出常见于大量的创建对象却没有释放,这种现象是比较容易排查的,只需要判断某类对象是否过多即可。常见于重复代码块,或因某个事件频繁触发导致某个方法被频繁调用,且方法里的对象一直没被释放导致内存溢出。

3. GC执行异常

异常日志:

GC overhead limit exceeded

当多次执行垃圾收集的时间占用了CPU的98%,且GC回收的内存少于2%,JVM就会抛出这个异常。但这个异常在部分情况下都是会被Java heap space代替的,所以仅凭这个无法准确判断出具体是什么问题,唯一能确定的就是当前堆内存已经被占满,且在频繁的执行GC,和堆内存溢出有相似之处。

处理方式一般和堆内存异常类似,需要排查哪类对象占用了过多的内存,在哪个代码块中存在频繁的创建对象且不释放的情况。

4. 元空间内存溢出

异常日志:

Metaspace 

从JDK8起,元空间代替了永久代,元空间一般存储的数据为Class对象和常量对象等。

当出现这个问题需要着重排查新增的代理对象和字符串intern方法的使用。

5. 创建线程异常

异常日志:

Unable to create new native thread

每个机器内核创建的线程数量是有限制的,当创建的线程数量过多时抛出该异常。

这类问题只要指定了线程名称都很好排查,可以利用Visual VM查看堆转储上的线程就能看出来是哪些线程异常数量过多。

6. 内存交换问题

异常日志:

Out of swap space?

操作系统一般都有虚拟内存,当物理运行内存不够时会使用虚拟内存,但当虚拟内存都无法满足JVM的要求时就会抛出该异常。

一般碰到这个问题需要检查JVM的大小配置是否超过了机器本身配置,并检查有没有哪些对象创建数量异常导致内存飙升。如果配置或代码都没问题,那最终只能升级机器、转微服务开发或对程序业务进行拆分以满足程序的性能要求。

7. 数组长度过大

异常日志:

Requested array size exceeds VM limit

出现的频率较低,当数组的长度超出JVM的限制则抛该异常。

如果实际不需要这么长的数组则设置合适即可,如果需要这么长的数组则需要对数组进行分段处理。

8. 系统误杀异常

异常日志:

Kill process or sacrifice child

当操作系统可用内存极低的情况下会触发killer操作杀掉部分线程,如果Java程序因为这个情况被误杀则会抛出该异常。

一般原因是服务器运行了其它的程序,导致其它的程序占用过多内存,触发了killer机制,Java程序单独部署可以避免这个问题。

生产问题千奇百怪,但只要把握住Java的运行时原理,大致判断出不同的对象数据存储在哪些地方,并根据堆对象统计大致判断出问题所在,大部分生产问题都是可以解决的。

使用dump排查问题不是洪水猛兽。

相关文章:

JDK8使用Visual VM根据Dump文件排查OutOfMemoryError生产问题思路

文章目录1. 前言2. 堆内存溢出3. GC执行异常4. 元空间内存溢出5. 创建线程异常6. 内存交换问题7. 数组长度过大8. 系统误杀异常1. 前言 当系统异常产生了dump文件需要我们对其进行排查时,其本质上考验的是我们对于Java运行时内存结构的知识掌握是否牢固以及对业务代…...

2023年网络安全比赛--网络安全事件响应中职组(超详细)

一、竞赛时间 180分钟 共计3小时 二、竞赛阶段 1.找出黑客植入到系统中的二进制木马程序,并将木马程序的名称作为Flag值(若存在多个提交时使用英文逗号隔开,例如bin,sbin,…)提交; 2.找出被黑客修改的系统默认指令,并将被修改的指令里最后一个单词作为Flag值提交; 3.找出…...

【半监督学习】3、PseCo | FPN 错位对齐的高效半监督目标检测器

文章目录一、背景二、方法2.1 基础框架结构2.2 带噪声的伪边界框学习2.3 多视图尺度不变性学习三、实验论文:PseCo: Pseudo Labeling and Consistency Training for Semi-Supervised Object Detection 代码:https://github.com/ligang-cs/PseCo 出处&a…...

Tomcat+Servlet初识

文章目录Tomcat什么是TomcatTomcat的安装启动tomcat静态页面的访问动态页面的访问一个Servlet程序的部署流程Tomcat 什么是Tomcat Tomcat是一个HTTP服务器,在开发或调试Servlet代码时应用广泛;使用Tomcat,实际就是将用户浏览器输入的http请…...

ChatGPT-4 终于来了(文末附免费体验地址)

大家好,我是小钱学长。 ChatGPT4.0 重磅来袭,今天一打开plus页面出现的就是这个GPT-4的体验界面!现在就带大家一起看看GPT4.0​。 进入之后是这样的 看到最下面有一行话,目前应该是4个小时限制100条消息。 GPT-4有什么优势&…...

【C++学习】类和对象(中)一招带你彻底了解六大默认成员函数

前言:在之前,我们对类和对象的上篇进行了讲解,今天我们我将给大家带来的是类和对象中篇的学习,继续深入探讨【C】中类和对象的相关知识!!! 目录 1. 类的6个默认成员函数 2. 构造函数 2.1概念介…...

面试——Java基础

说一说你对Java访问权限的了解 在修饰成员变量/成员方法时,该成员的四种访问权限的含义如下: private:该成员可以被该类内部成员访问; default:该成员可以被该类内部成员访问,也可以被同一包下其他的类访…...

JavaWeb——Request(请求)和Response(响应)介绍

在写servlet时需要实现5个方法,在一个service方法里面有两个参数request和response。 浏览器向服务器发送请求会发送HTTP的请求数据——字符串,这些字符串会被Tomcat所解析,然后这些请求数据会被放到一个对象(request)里面保存。 相应的Tom…...

JMeter压测文件上传接口和中文乱码

一、压测文件上传接口 新建测试计划,然后添加需要的元件。 1、添加HTTP信息头管理器 可以在测试计划中添加,也可以在线程组里面添加。 我的接口使用到 token信息。这里在测试计划中添加。 2、添加线程组 上图解释:会在 2秒钟之内启动起来 5…...

CSRF漏洞复现

目录标题原理如何实现和xss区别危害CSRF实战(pikachu)dvwa靶场CSRF(Cross Site Request Forgery)。跨站请求伪造原理 攻击者会伪造一个请求(一般是一个链接),然后让用户去点击,然后…...

Google Colab导入GitHub python项目进行运行

本文介绍包含 ipynb后缀文件的github项目,导入到GitHub上进行运行的方法。 导入项目 Colab是需要梯子的。 访问网址:https://colab.research.google.com 输入github网之后回车,下面的内容是从github上自动获取的。 选择项目要打开的ipynb文…...

Qss样式表语法

QSS样式表语法 更多精彩内容👉个人内容分类汇总 👈👉QSS样式学习 👈文章目录QSS样式表语法[toc]概述一、样式规则二、选择器类型三、子控件四、伪状态五、样式表冲突解决六、级联七、继承八、命名空间中的控件概述 Qt样式表的概念…...

「Python 基础」异步 I/O 编程

I/O 密集型应用程序大大提升系统多任务处理能力; 异步 I/O 模型 一个消息循环,主线程在消息循环中不断重复 读取消息-处理消息; # 获取线程池 loop get_event_loop() while True:# 接收事件消息event loop.get_event()# 处理事件消息pro…...

通配符的匹配很全面, 但无法找到元素 ‘tx:advice‘ 的声明

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; 通配符的匹配很全面, 但无法找到元素 ‘tx:advice’ 的声明 错误原因&#xff1a; xmlns和xsi:schemaLocation未书写约束或者书写错误 正确书写 <beans xmlns:tx&q…...

响应式编程详解,带你熟悉Reactor响应式编程

文章目录一、什么是响应式编程1、Java的流和响应式流2、Java中响应式的使用3、Reactor中响应式流的基本接口4、Reactor中响应式接口的基本使用二、初始Reactor1、Flux和Mono的基本介绍2、引入Reactor依赖3、响应式类型的创建4、响应式类型的组合&#xff08;1&#xff09;使用m…...

踩坑篇之WebSocket实现类中无法使用@Autowired注入对象

大家好&#xff0c;我是小简&#xff0c;今天我又大意了&#xff0c;在WebSocket这个类上踩坑了。 接下来我讲讲我踩坑的经历吧&#xff01; package cn.donglifeng.shop.socket.endpoin;import cn.donglifeng.shop.common.context.SpringBeanContext; import cn.donglifeng.s…...

QT CTK插件框架 (一 下载编译)

CTK 为支持生物医学图像计算的公共开发包&#xff0c;其全称为 Common Toolkit。为医学成像提供一组统一的基本功能&#xff1b;促进代码和数据的交互及结合&#xff1b;避免重复开发&#xff1b;在工具包&#xff08;医学成像&#xff09;范围内不断扩展到新任务&#xff0c;而…...

【Java版oj】day10 井字棋、密码强度等级

目录 一、井字棋 &#xff08;1&#xff09;原题再现 &#xff08;2&#xff09;问题分析 &#xff08;3&#xff09;完整代码 二、密码强度等级 &#xff08;1&#xff09;原题再现 &#xff08;2&#xff09;问题分析 &#xff08;3&#xff09;完整代码 一、井字棋 &a…...

JavaScript的事件传播机制

你在学习和编写JavaScript时可能听说过事件冒泡&#xff08;event bubbling&#xff09;。它会发生在多个元素存在嵌套关系&#xff0c;并且这些元素都注册了同一事件(例如click)的监听器时。 但是事件冒泡只是事件机制的一部分。它经常与事件捕获(event capturing)和事件传播…...

队列的定义及基本操作实现(链式)

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️数据结构与算法】 学习名言&#xff1a;天子重英豪&#xff0c;文章教儿曹。万般皆下品&#xff0c;惟有读书高 系列文章目录 第一章 ❤️ 学前知识 第二章 ❤️ 单向链表 第三章 ❤️ 递归 文章目录…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

用机器学习破解新能源领域的“弃风”难题

音乐发烧友深有体会&#xff0c;玩音乐的本质就是玩电网。火电声音偏暖&#xff0c;水电偏冷&#xff0c;风电偏空旷。至于太阳能发的电&#xff0c;则略显朦胧和单薄。 不知你是否有感觉&#xff0c;近两年家里的音响声音越来越冷&#xff0c;听起来越来越单薄&#xff1f; —…...

基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解

JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用&#xff0c;结合SQLite数据库实现联系人管理功能&#xff0c;并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能&#xff0c;同时可以最小化到系统…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)

引言 在人工智能飞速发展的今天&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;已成为技术领域的焦点。从智能写作到代码生成&#xff0c;LLM 的应用场景不断扩展&#xff0c;深刻改变了我们的工作和生活方式。然而&#xff0c;理解这些模型的内部…...

解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist

现象&#xff1a; android studio报错&#xff1a; [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决&#xff1a; 不要动CMakeLists.…...

日常一水C

多态 言简意赅&#xff1a;就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过&#xff0c;当子类和父类的函数名相同时&#xff0c;会隐藏父类的同名函数转而调用子类的同名函数&#xff0c;如果要调用父类的同名函数&#xff0c;那么就需要对父类进行引用&#…...