JVM线程和内存溢出问题排查思路

一、工具

Arthas:Arthas 是一款能在线查看应用 load、内存、gc、线程 等状态信息,并对业务问题进行诊断的工具,支持 JDK 6+ 和 Linux/Mac/Windows 系统。

jstack:jstack是JVM自带的Java堆栈跟踪工具,它用于打印出给定的java进程ID、core file、远程调试服务的Java堆栈信息。参考连接

jmap:jmap能够打印给定Java进程、核心文件或远程DEBUG服务器的共享对象内存映射或堆内存的详细信息。

jstat:jstat命令可以查看堆内存各部分的使用量,以及加载类的数量。

jcmd:jdk1.8开始提供了一个方便扩展的诊断命令jcmd,用来取代之前比较分散的jdk基础命令,如jps、jstack、jmap、jinfo等,并且jdk添加新的诊断功能。

二、jstack查看线程快照

用于定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等问题。

  • top,查看各进程使用情况
  • top -Hp pid,查看进程pid的各线程运行情况
  • printf ‘%x\n’ tid,将线程号转为16进制;其中tid为线程号
  • jstack pid | grep ‘0x4295’ -C10 --color,查看进程pid的0x4295线程快照,分析线程停顿原因和代码行。
三、jstat统计垃圾回收情况(查看gc频率)

jstat -gcutil pid

S0:幸存1区当前使用比例
S1:幸存2区当前使用比例
E:伊甸园区使用比例
O:老年代使用比例
M:元数据区使用比例
CCS:压缩使用比例
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间

四、jmap查看堆内存情况、制作dump文件

jmap -heap 17038,17038为进程号,查看进程号位17083的进程的堆内存使用情况。

jmap -dump:live,format=b,file=filename.hprof pid,生成进程号位pid的进程的堆内存dump文件。

五、内存溢出的几个错误

outOfMemoryError 年老代内存不足。
outOfMemoryError:PermGen Space 永久代内存不足。
outOfMemoryError:GC overhead limit exceed 垃圾回收时间占用系统运行时间的98%或以上。

六、排查思路
  1. 通过top命令查看进程情况、找到最消耗资源的java进程,这一步在不知道哪个java程序消耗资源最大的情况执行,如果已经知道是哪个java程序,则可以直接进入第二步(这一步获得进程ID pid)

  2. 通过top -Hp pid,查看进程pid中最消耗资源的线程,这一步将获得线程ID tid

  3. 此时可以先使用jstack命令查看线程tid的运行情况

    printf '%x\n' tid这个命令将得到一个标识线程tid的十六进制值nid。

    jstack pid | grep nid -C10 --color这个命令将显示线程tid(nid为十六进制表示)的线程快照,可以找到线程是否阻塞等。

  4. 使用jmap命令查看进程pid的堆内存使用情况

    jmap -heap pid这个命令将显示进程pid堆内存的使用情况,如果堆内存占用过高,可以使用jmap生成dump文件进行进一步分析

    jmap -dump:live,format=b,file=filename.hprof pid这个命令将生成进程pid的堆内存使用情况的dump文件。

    除此之外也可以使用jstat命令分析垃圾回收情况,看看是否进行频繁的gc。

    jstat -gcutil pid这个命令将显示进程pid的gc频率等。

  5. 最后查看程序日志是否有outOfMemoryErroroutOfMemoryError:PermGen SpaceoutOfMemoryError:GC overhead limit exceed等内存溢出相关错误,这个也可以在第一步之前查看。

  6. 如果确定是内存溢出问题,最好使用可视化工具分析生成的dump文件,找到内存溢出的位置。(一般在启动java程序时配置jvm保存dump文件)

注:为了出现内存溢出问题时能够排查问题,运行jar包时添加jvm配置:

java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/tmp/heapdump.hprof -jar app.jar

这将保留堆内存快照,以便将来分析内存使用。

本笔记只记录每个工具可以用来查看什么信息以及什么时候可以用什么工具,并不记录上述工具的详细使用方法。

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

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

相关文章

PDK安装及简介

目录 PDK简介 pdk安装 Standard Cell Library简介 IO Library简介 PDK简介 PDK:全称Process Design Kit,是工艺设计工具包的缩写,是制造和设计之间的沟通桥梁,是模拟电路设计的起始点。 具体来说,PDK是代工厂(FAB…

使用Docker进行Jmeter分布式搭建

大家好,随着技术的不断发展,对性能测试的要求也日益提高。在这样的背景下,如何利用 Docker 来巧妙地搭建 Jmeter 分布式成为了关键所在。现在,就让我们开启这场探索之旅,揭开其神秘的面纱。前段时间给大家分享了关于 L…

通信指挥类装备(多链路聚合设备)-应急通信指挥解决方案

现场通信指挥系统是一种功能全面的便携式音视频融合指挥通信平台,可实现现场应急救援指挥、多种通信手段融合、现场通信组网等功能,是现场指挥系统的延伸。 多链路聚合设备,是一款通信指挥类装备,具有 4G/5G,专网&…

Golang开发:切片的两种创建方式及区别

在Go语言中,var和make都可以用来初始化切片(slice),但它们之间有一些重要的区别。 初始化方式: 使用var关键字声明的切片会被初始化为nil,即没有底层数组,长度为0,容量为0。使用make…

Free RTOS中Semaphore(二值信号量)的使用介绍

目录 概述 1 使用STM32Cube 配置信号量 1.1 引子 1.2 STM32Cube中配置FreeRTOS 1.3 STM32Cube生成Project 2 cmsis_os中信号量接口函数 2.1 函数:osSemaphoreNew 2.2 函数:osSemaphoreGetName 2.3 函数:osSemaphoreAcquire 2.4 函数…

hashmap数据结构为什么是链表

HashMap 数据结构中,链表通常用于解决哈希冲突。当不同的键映射到相同的哈希桶时,就会发生哈希冲突。链表是一种简单而有效的解决方法。 在 JDK 8 之前的 HashMap 实现中,当发生哈希冲突时,冲突的元素会被存储在同一个哈希桶中&a…

设计模式:外观模式(Facade)

设计模式:外观模式(Facade) 设计模式:外观模式(Facade)模式动机模式定义模式结构时序图模式实现在单线程环境下的测试在多线程环境下的测试模式分析优缺点适用场景应用场景模式扩展参考 设计模式&#xff1…

C++STL(queue和list)

3.6 queue 容器 3.6.1 queue 基本概念 概念:Queue是一种先进先出(First In First Out,FIFO)的数据结构,它有两个出口 队列容器允许从一端新增元素,从另一端移除元素队列中只有队头和队尾才可以被外界使用,因此队列不允许有遍历…

【Open AI】GPT-4o深夜发布:视觉、听觉跨越式升级

北京时间5月14日1点整,OpenAI 召开了首场春季发布会,CTO Mira Murati 在台上和团队用短短不到30分钟的时间,揭开了最新旗舰模型 GPT-4o 的神秘面纱,以及基于 GPT-4o 的 ChatGPT,均为免费使用。 本文内容来自OpenAI网站…

大数据面试 --- 六

1、Flink中的三种时间,哪一个性能会比较好 在Flink中主要分成三种时间: 事件时间(Event Time)注入时间(Process Time)、摄入时间(Ingestion Time) 事件时间指的是事件产生的时间…

课时126:awk实践_进阶知识_内置函数1

1.2.5 内置函数1 学习目标 这一节,我们从 基础知识、简单实践、小结 三个方面来学习。 基础知识 简介 在awk内部预制了一些函数,借助于这些函数,我们可以实现相关场景的快速操作。这些内置函数的常见类型有:数值类内置函数int…

人工智能|深度学习——YOLOV8结构图

YoloV8相对于YoloV5的改进点: Replace the C3 module with the C2f module.Replace the first 6x6 Conv with 3x3 Conv in the Backbone.Delete two Convs (No.10 and No.14 in the YOLOv5 config).Replace the first 1x1 Conv with 3x3 Conv in the Bottleneck.Use…

【图神经网络——消息传递】

消息传递机制 画图先:导包:画图: 实现消息传递:例子一:例子二: 画图先: 导包: import networkx as nx import matplotlib.pyplot as plt import torch from torch_geometric.nn im…

Linux操作系统最著名的两大系列Red Hat和Debian

Linux操作系统可以根据其背后的项目或社区分为不同的系列,其中最著名的两大系列是Red Hat系列和Debian系列。 1.著名的两大系列是Red Hat和Debian Red Hat系列: Red Hat Enterprise Linux (RHEL):这是Red Hat公司推出的企业级操作系统&#…

【LAMMPS学习】十、LAMMPS辅助工具(1)

10. 辅助工具 LAMMPS 被设计为用于执行分子动力学计算的计算内核。设置和分析模拟通常需要额外的预处理和后处理步骤。此类工具的列表可以在 LAMMPS 网页上的以下链接中找到: 前/后处理 外部 LAMMPS 软件包和工具 Pizza.py 工具包 Pizza.py 的最后一个链接是桑迪…

CTFshow misc

第一题1 打开图片直接就是flag 第二题0 放入010发现文件头有png 更换后缀 获得flag 第三题1 下载之后发现是bpg后缀 用在线工具转换为png获得flag 第四题 0 把六个文件后缀都改为png即可获得flag

Visual Studio Code 扩展程序Text Edits

需求 比如把Scarzombie_Monster全部转换为大写或者小写 安装 Text Edits 直接搜索安装即可 使用 假如要把Scarzombie_Monster全部转为大写,选中右键选中 To Upper Case或者直接快捷键shiftAltU即可

使用yolov8 训练coco 和自己的关键点识别数据集的参考

使用yolov8 训练关键点配置理解 1. coco-pose.yaml 修改关键参数kpt_shape: [17, 3]flip_idx: [0, 2, 1, 4, 3, 6, 5, 8, 7, 10, 9, 12, 11, 14, 13, 16, 15]2. yolov8n-pose.yaml 修改kpt_shape3. 编写 train文件4.一个封装的推理代码1. coco-pose.yaml 修改关键参数 kpt_sha…

DHCP动态主机配置协议

DHCP概述 DHCP是什么 DHCP:Dynamic Host Configuration Protocol:动态主机配置协议DHCP是一种集中对用户IP地址进行动态管理和配置的技术 DHCP作用: 作用:实现IP地址的动态分配和集中管理优势:避免手工配置IP地址&…

linux编译gdb

下载 我下载了8.3 Index of /gnu/gdb 编译 make cleanmake diskclean./configure \--without-x \--disable-werrormake make install