JVM OOM和CPU问题排查

news2024/9/20 6:27:22

目录

1、JVM调优工具

1.1、jps

1.2、jstat

1.3、jstack

1.4、jinfo 

1.5、jmap

2、OOM排查过程

2.1、OOM原因

2.2、OOM发生区域

2.2.1、Java堆溢出:heap

2.2.2、Java栈溢出:stack

2.2.3、运行时常量溢出:constant

2.2.4、方法区溢出:directMemory

2.3、OOM排查流程

3、CPU排查过程

3.1、核心步骤排查

3.2、CPU飙升原因分析


  • 吞吐量 = CPU运行用户代码时间/(运行用户代码时间+垃圾收集时间);
  • 暂停时间 = 执行垃圾回收时,程序的工作线程被暂停的时间;
  • 内存占用 = java堆所占内存的大小;
  • 收集频率 = 垃圾收集的频次。

1、JVM调优工具

1.1、jps

        查看Java进程的工具,可获取所需进程的PID,跟Linux下的ps命令类似。

1.2、jstat

        显示虚拟机进程中的类装载、内存、垃圾收集等运行数据。

        Jstat [option] VMID 打印间隔时间(ms) 打印次数

1.3、jstack

        查看当前Java程序内线程详细堆栈信息的工具,用于生成JVM进程当前时刻的线程的调用堆栈,可以用来定位线程间死锁、锁等待、等待外部资源等。

1.4、jinfo 

        查看JVM参数、动态修改部分JVM参数。

        Jinfo [option] pid

  1. -flag<name> 打印指定名称的参数
  2. -flag[+|-]<name> 打开或关闭参数
  3. -flag<name>=<value> 设置参数
  4. -flags 打印所有参数
  5. -sysprops 打印系统配置

1.5、jmap

用于生成堆转储快照dump文件,常用于分析OOM异常情况。

-dump:生成java堆的dump文件

jhat [option] dumpfile:分析jmap生成的dump文件。

2、OOM排查过程

2.1、OOM原因

  • 内存中加载的数据量过于庞大,如一次从数据库取出过多数据;
  • 资源使用之后没有及时关闭,导致对象无法被GC回收;
  • 代码中存在死循环或循环产生过多重复的对象实体;
  • 使用的第三方软件中的BUG;
  • 启动参数内存值设定的过小;

2.2、OOM发生区域

2.2.1、Java堆溢出:heap

        java.lang.OutofMemoryError:Java heap space

        原因:内存泄露、JVM内存小、创建太多的对象没有释放。

        相关JVM参数:-Xms、-Xmx

2.2.2、Java栈溢出:stack

        java.lang.StackOverflowError,常发生于递归。

        java.lang.OutofMemoryError: unable to create new native thread,常发生于创建太多线程。

        相关JVM参数:-Xss,表示每个线程的堆栈大小。

2.2.3、运行时常量溢出:constant

        java.lang.OutofMemoryError: PermGen space。

        运行时常量保存在方法区,存放的主要是编译器生成的各种字面量和符号引用,但是运行期间也可能将新的常量放入池中。

        -XX:PermSize:设置持久代(perm gen)初始值,默认值为物理内存的1/64

        -XX:MaxPermSize:设置持久代最大值,默认为物理内存的1/4

2.2.4、方法区溢出:directMemory

        java.lang.OutofMemoryError: PermGen space。

        方法区主要存储被虚拟机加载的类信息,如类名、访问修饰符、常量池、字段描述、方法描述等。目前很多框架,如Spring、Hibernate等会在运行过程中动态生成类,所以方法区也有可能发生OOM。

2.3、OOM排查流程

需要先设置JVM参数,设定当发生OOM的时候自动生成dump出堆信息:

  • 开启堆快照:-XX:+HeapDumpOnOutOfMemoryError
  • OOM时日志记录文件位置:-XX:HeapDumpPath=/usr/local/error.hprof

1、先查看应用pid号:ps -ef|grep 应用名/java;

        或者使用jps查看JVM中运行的进程状态信息;

2、查看pid垃圾回收情况:jstat -gc pid 5000(时间间隔)

        查看堆内存各部分的使用量,加载类的数量以及GC的情况

3、使用jmap -histo:live pid 显示堆中的详细信息

4、使用jmap -dump:format=b,file=heapdump.phrof pid生成堆存储快照,然后将快照文件使用jvisualvm进行分析;

3、CPU排查过程

3.1、核心步骤排查

  1. 执行”top”命令:查看所有进程占系统CPU的排序。找出进程号(PID)。
  2. 执行”top -Hp PID”命令:查看java进程下的所有线程占CPU的情况。
  3. 执行printf “%x\n 10”命令 :后续查看线程堆栈信息展示的都是十六进制,所以需要把线程号转成16进制。例如, printf "%x\n 10"->打印:a,那么在jstack中线程号就是0xa.
  4. 执行 “jstack PID | grep 线程ID”:查找某进程下->线程ID(jstack堆栈信息中的nid)=0xa的线程堆栈信息。如果“"VM Thread" os_prio=0 tid=0x00007f871806e000 nid=0xa runnable”,第一个双引号圈起来的就是线程名,如果是“VM Thread”这就是虚拟机GC回收线程了
  5. 1、执行“jstat -gcutil 进程号” 统计间隔毫秒 统计次数(缺省代表一致统计)”,查看某进程GC持续变化情况,如果发现返回中FGC很大且一直增大->确认Full GC!                           
  6. 2、也可以使用“jmap -heap 进程ID”查看一下进程的堆内从是不是要溢出了,特别是老年代内从使用情况一般是达到阈值(具体看垃圾回收器和启动时配置的阈值)就会进程Full GC。
  7. 执行“jmap -dump:format=b,file=filename 进程ID”,导出某进程下内存heap输出到文件中。可以通过eclipse的mat工具查看内存中有哪些对象比较多。

3.2、CPU飙升原因分析

  • 内存消耗过大,导致Full GC次数过多

  • 代码中有大量消耗CPU的操作,导致CPU过高,系统运行缓慢

  • 由于锁使用不当,导致死锁

  • 随机出现大量线程访问接口缓慢

  • 某个线程由于某种原因而进入WAITING状态,此时该功能整体不可用,但是无法复现

以上内容为个人学习理解,如有问题,欢迎在评论区指出。

部分内容截取自网络,如有侵权,联系作者删除。

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

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

相关文章

计算机毕业设计选题推荐nodejs+vue355的网上购物商城系统

网上购物商城&#xff0c;在系统首页可以查看首页、关于我们、商品信息、新闻信息、交流论坛、留言反馈、个人中心、后台管理、在线客服等内容 前端技术&#xff1a;nodejsvueelementui 前端&#xff1a;HTML5,CSS3、JavaScript、VUE 1、 node_modules文件夹(有npn install产…

spring整合mybatis的核心思路(数据源切换)

文章目录1. 整合思路2. 最简单的整合步骤1. 导入依赖2. 准备基础类UserUserMapperuserMapper.xmlMybatisConfig3. 测试TestMybatisSpring3. 整合多个mybatis配置1. 修改MybatisConfig2. 测试TestMybatisSpring4. AbstractRoutingDataSource实现源切换1. 准备基础类PersonPerson…

JVM的栈内存

每当启动一个新线程时&#xff0c;Java虚拟机都会为它分配一个Java栈。Java栈以帧为单位保存线程的运行状态。虚拟机只会直接对Java栈执行两种操作&#xff1a;以帧为单位的压栈和出栈。 某个线程正在执行的方法被称为该线程的当前方法&#xff0c;当前方法使用的栈帧称为当前帧…

车载以太网 - SomeIP测试 - 初识 - 01

SOA,Service-Oriented Architecture,即面向服务的架构 SOA是一种面向服务的架构,定义了“服务器”和“客户端”,前者是服务、数据的提供者,后者是订阅了所需要的服务或者数据。应用程序之间是公三耦合,并通过服务总线作为中间件进行通信。SOA更像是一种框架,需要将信息从…

【JavaGuide面试总结】Java集合篇·下

【JavaGuide面试总结】Java集合篇下1.HashMap 的长度为什么是 2 的幂次方2.HashMap 有哪几种常见的遍历方式?3.HashSet 如何检查重复?4.ConcurrentHashMap 和 Hashtable 的区别5.ConcurrentHashMap 线程安全的具体实现方式/底层具体实现JDK1.8 之前JDK1.8 之后6.JDK 1.7 和 J…

从零编写linux0.11 - 第九章 文件系统(一)

从零编写linux0.11 - 第九章 文件系统&#xff08;一&#xff09; 编程环境&#xff1a;Ubuntu 20.04、gcc-9.4.0 代码仓库&#xff1a;https://gitee.com/AprilSloan/linux0.11-project linux0.11源码下载&#xff08;不能直接编译&#xff0c;需进行修改&#xff09; 本章…

【青训营】Go的一些性能优化技巧

一、Slice切片的性能优化 对Slice进行内存预分配 尽可能在使用make()初始化函数的时候提供容量信息&#xff0c;因为切片本质是一个数组片段的描述&#xff0c;其源码如下&#xff1a; type slice struct{array unsafe.Pointerlen int// 长度cap int// 容量 }如果没有指定容…

22.1.28打卡 Codeforces Round #847 (Div. 3) A~E

https://codeforces.com/contest/1790A. Polycarp and the Day of Pi题意问你第一个和"314159265358979323846264338327"不同的字符串下标1是什么如果全部相同输出最后一个下标1/* ⣿⣿⣿⣿⣿⣿⡷⣯⢿⣿⣷⣻⢯⣿⡽⣻⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣇⠸⣿⣿⣆…

Python基于LSTM预测特斯拉股票

Python基于LSTM预测特斯拉股票 提示&#xff1a;前言 Python基于LSTM预测特斯拉股票 股票预测是指&#xff1a;对股市具有深刻了解的证券分析人员根据股票行情的发展进行的对未来股市发展方向以及涨跌程度的预测行为。这种预测行为只是基于假定的因素为既定的前提条件为基础的…

通用智能基础模型假说

🍿*★,*:.☆欢迎您/$:*.★* 🍿 https://dongfangyou.blog.csdn.net/article/details/128761358 通过上面说的 人本身自带一个 各种行为反馈的评价模型 拥有这个模型便可拥有通用智能 简单的分析一下该模型到底应该由什么组成 最基础的模型是什么 首先人类最基础的模型应该…

【小程序】类taro语法中小程序端使用f2

前言 最近在类taro框架中小程序端使用最新版f2。&#xff08;这里我使用rax&#xff09;并封装了库&#xff0c;特此记录一下。 使用 想直接用的同学直接在你的rax项目中安装rax-my-f2这个包&#xff0c;他依赖antv/f2与antv/f2-context这2个包。 import { MyCanvas } from…

Kubernetes 笔记(06)— 搭建多节点集群、kubeadm 安装 master/worker/console/flannel 网络插件

1. kubeadm 官网&#xff1a;https://kubernetes.io/zh-cn/docs/reference/setup-tools/kubeadm/ 为了简化 Kubernetes 的部署工作&#xff0c;社区里就出现了一个专门用来在集群中安装 Kubernetes 的工具&#xff0c;名字就叫 kubeadm&#xff0c;意思就是 Kubernetes 管理员…

Java设计模式-状态模式State

介绍 状态模式&#xff08;State Pattern&#xff09;&#xff1a;它主要用来解决对象在多种状态转换时&#xff0c;需要对外输出不同的行为的问题。状态和行为是一一对应的&#xff0c;状态之间可以相互转换。当一个对象的内在状态改变时&#xff0c;允许改变其行为&#xff…

学习记录677@项目管理之配置管理案例

案例 Simple公司的质量管理体系中的配置管理程序文件中有如下规定: (1)由变更控制委员会(CCB)制定项目的配置管理计划; (2)由配置管理员(CMO)创建配置管理环境: (3)由CCB 审核变更计划; (4)项目中配置基线的变更经过变更申请、变更评估、变更实施后便可发布&#xff1b; (5)CC…

Java基础10:常用API(下)

Java基础10&#xff1a;常用API&#xff08;下&#xff09;一、Date二、SimpleDateFormat三、Calendar四、ZoneId五、Instant六、ZoneDateTime七、DateTimeFormatter八、LocalDate、LocalTime、LocalDateTime九、Duration、Period、ChronoUnit十、包装类一、Date Date类是一个…

基于PIL和Tesseract的数字计算验证码识别处理思路

如图,我们在使用python自动化的时候经常会遇到很多各式各样的验证码。这个是一个数字加法的验证码。 干扰项里包含完整的数字、字母信息,普通的OCR识别可能不是很准确。 但是不管怎们样,咱们先把必要的环境搭建起来,试一下Tesseract的识别结果吧。 1、安装Tesseract: 首…

屏蔽360阻止运程执行变更注册表自启动数据的办法

屏蔽360阻止运程执行变更注册表自启动数据的办法 运程服务器上的程序&#xff0c;由于需要。我在服务器中&#xff0c;加入更新升级自身&#xff08;exe&#xff09;文件&#xff0c;并变更操作系统自启动数据的代码。 实践证明&#xff0c;通过客户端&#xff0c;调用运程服务…

全景解析SSD IO QoS性能优化

一、NAND基本原理目前NAND已经从SLC发展到PLC&#xff0c;但是PLC离大规模上市还有一段距离&#xff0c;我们暂时先略过。市面上主要流通的就是4种NAND类型&#xff1a;SLC、MLC、TLC、QLC。随着每个寿命从高到低依次是SLC>MLC>TLC>QLC.随着单个cell含有的bit数越多&a…

Unity MRTK使用详解(Htc vive+LeapMotion)

MRTK-Unity是一个由Microsoft驱动的开源项目&#xff0c;提供了多种组件和功能&#xff0c;用于加速Unity中的跨平台MR应用程序开发。以下是其一些功能&#xff1a; 提供跨平台输入系统和用于空间交互和UI组件。 启用快速原型通过在编辑器中的模拟&#xff0c;让你马上看到变化…

创建大量TCP连接时会受到什么因素的限制?

1.文件描述符资源 用户级限制 我们可以使用ulimit命令查看系统允许当前用户进程打开的文件数限制&#xff1a; ulimit -n 我们可以使用 ulimit -n 文件数 来修改不过这种设置是临时的&#xff0c;只在当前的session中有效。为永久修改用户级文件描述符数限制&#xff0c;可以…