JVM内存性能调优思路之:通过GC log、Thread Dump 、Heap Dump分析内存使用说明

文章目录

  • 一. 各日志概述
      • 1. Garbage Collection Log - 找到GC规律
      • 2. 线程转储(Thread dump) - 分析(快照)线程状态
      • 3. 堆转储(Heap dump) - APP某刻内存使用全貌
  • 二. 命令
      • 1. 程序的gc日志
      • 2. 线程转储
      • 3. 堆转储

概述

在 Java 虚拟机中,(GC) Garbage collection log 垃圾收集日志、 Thread Dump 线程转储、( 储:代表存储到文件)和Heap Dump 堆转储用于分析应用程序的性能问题内存使用情况,通过分析这些文件我们能够找到程序性能瓶颈或给应用程序设定合适的内存。

本文关键词:

  1. OOM的定位
  2. 分析APP GC特性
  3. APP内存使用分布
  4. 某个线程状态ing

一. 各日志概述

1. Garbage Collection Log - 找到GC规律

什么是 GC Log?

GC 日志包含垃圾收集事件的相关信息。它将指示运行了多少 GC 事件、它们是什么类型的 GC 事件(即 Young GC 或 Full GC)、每个 GC 事件暂停应用程序的时间、每个 GC 事件回收了多少对象。

 

分析GC 日志能查看出什么问题 ?

GC的作用是回收不再使用的内存,以便程序有足够的内存继续运行。垃圾收集日志用于研究应用程序的 GC 和内存性能。它用于优化 GC 暂停时间,用于确定应用程序的最佳内存大小

  1. GC 活动频率:观察 GC 日志可以了解到各类型 GC 活动(例如 Minor GC、Major GC、Full GC)的发生频率和持续时间。频繁的 GC 活动可能会导致应用程序的性能下降,可以通过如下思路调优:

合理配置堆内存大小
减少对象的引用链
优化大对象的处理(例如手动管理内存或者使用专门的内存管理库)

  1. GC 效率:GC 日志中会记录每次 GC 活动的耗时和效率,包括停顿时间(Pause Time)、吞吐量(Throughput)等指标。通过分析这些指标,可以评估 GC 的性能,并针对性地调整 GC 策略和参数。
  2. GC 异常:GC 日志中还会记录一些异常情况,如 OutOfMemoryError、Metaspace OOM 等。这些异常可能会导致应用程序的崩溃或者异常终止,需要及时排查和处理。

 

2. 线程转储(Thread dump) - 分析(快照)线程状态

什么是 Thread dump?

线程转储是应用程序中在某个时间点上运行的所有线程的快照。它包含应用程序中每个线程的所有信息,例如: 线程状态、线程 Id、本机 Id、线程名称、堆栈跟踪、优先级。

 

线程转储文件能解决什么问题?

线程转储文件主要用于排除生产问题,例如 CPU 峰值、应用程序中的无响应性、响应时间差线程挂起高内存消耗。具体地:

  1. 死锁(Deadlock):线程转储文件可以帮助确定是否存在死锁,并提供导致死锁的线程及其堆栈跟踪信息,有助于识别和解决死锁问题。
  2. 线程阻塞(Thread Block):可以确定哪些线程处于阻塞状态以及造成阻塞的原因,帮助排查应用程序中的线程阻塞问题。
  3. 性能问题:可以发现线程争用、长时间阻塞等,有助于优化应用程序的性能。
  4. 线程间通信问题:可能存在的线程间通信问题,如竞争条件、资源争用等。

 

3. 堆转储(Heap dump) - APP某刻内存使用全貌

什么是堆转储?

是指将 Java 虚拟机(JVM)中的堆内存中的对象信息以文件形式保存下来的过程,是某个时间的快照。堆转储文件包含了当前 JVM 堆中所有对象的详细信息,包括对象类型、大小、引用关系等。

 

分析堆转储能解决什么问题?

  1. 内存泄漏(Memory Leak)根源:可以识别出未被释放的对象(内存泄漏)占用了过多的内存空间,导致堆内存持续增长。通过定位哪些对象占用了大量内存以及它们的引用链,可以找出造成内存泄漏的根源。
  2. 内存溢出(Out of Memory)
  3. 内存碎片化(Fragmentation):可以观察到堆内存的分配情况,包括对象的分布和内存碎片化程度。这有助于评估堆内存的使用效率,并采取措施减少内存碎片化,提高内存分配的效率。
  4. 性能瓶颈:可以识别出占用大量内存的对象类型和方法调用频繁创建临时对象的代码段进而有助于找出性能瓶颈。

 

二. 命令

1. 程序的gc日志


#打印GC详情信息
-XX:+PrintGCDetails
#打印GC时间戳
-XX:+PrintGCDateStamps
#打印触发GC原因信息
-XX:+PrintGCCause
#日志存放路径
-Xloggc:d:/gslog/qms/gc-%t.log
#开启日志文件分隔
-XX:+UseGCLogFileRotation
#最多分割几个文件,超过之后从头开始写
-XX:NumberOfGCLogFiles=5
#每个文件大小
-XX:GCLogFileSize=20Mnohup java -Xmx1024m -Xms1024m -XX:+UseG1GC -XX:+DisableExplicitGC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -XX:+PrintGCCause -Xloggc:d:/gslog/qms/gc-%t.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=50M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${D:\gslog\oomlog} -jar xxx.jar &

日志说明
在这里插入图片描述

分析工具一:gceasy:https://gceasy.ycrash.cn/gc-dashboard.jsp
在这里插入图片描述

 

分析工具二:GCviewer:https://github.com/chewiebug/GCViewer/releases
在这里插入图片描述
 
在这里插入图片描述

“Summary(摘要)” 中比较有用的是:

  • “Throughput”(吞吐量百分比),吞吐量显示了有效工作的时间比例,剩下的部分就是 GC 的消耗
  • “Number of GC pauses”(GC 暂停的次数)
  • “Number of full GC pauses”(Full GC 暂停的次数)

以上示例中的吞吐量为 13.03%。这意味着有 86.97% 的 CPU 时间用在了 GC 上面。很明显系统所面临的情况很糟糕——宝贵的 CPU 时间没有用于执行实际工作,而是在试图清理垃圾。原因也很简单,我们只给程序分配了 512MB 堆内存。

在这里插入图片描述

其中“Pause”展示了 GC 暂停的总时间,平均值,最小值和最大值。这些统计可以很快判断出暂停时间是否过长。
如图我们可以得出明确的信息:累计暂停时间为 26.89秒(占总运行时间的98.9%),GC 暂停的总次数为 599 次,这在 30 秒的总运行时间里那不是一般的高。

一般来说,图像化信息能迅速揭示以下症状:

  • 低吞吐量:当应用的吞吐量下降到不能容忍的地步时,用于真正的业务处理的有效时间就大量减少。按照经验,低于90% 的有效时间就值得警惕了,可能需要好好优化下 GC。
  • 单次 GC 的暂停时间过长:只要有一次 GC停顿时间过长,就会影响程序的延迟指标。例如,延迟需求规定必须在 1000ms 以内完成交易,那就不能容忍任何一次GC暂停超过 1000毫秒。
  • 堆内存使用率过高:如果老年代空间在 Full GC之后仍然接近全满,程序性能就会大幅降低,可能是资源不足或者内存泄漏。这种症状会对吞吐量产生严重影响。

参考:
GC 日志解读与分析(番外篇可视化工具)
 

2. 线程转储


jstack -l 10414 > threadDump.log   

具体使用见我的文章:Thread Dump分析方法
 

3. 堆转储


jmap -dump:file=<file_name> <pid>

 

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

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

相关文章

C++ 类和对象(初篇)

类的引入 C语言中&#xff0c;结构体中只能定义变量&#xff0c;在C中&#xff0c;结构体内不仅可以定义变量&#xff0c;也可以定义函数。 而为了区分C和C我们将结构体重新命名成class去定义 类的定义 标准格式&#xff1a; class className {// 类体&#xff1a;由成员函…

【计算机毕业设计】计算机考试系统设计——后附源码

&#x1f389;**欢迎来到我的技术世界&#xff01;**&#x1f389; &#x1f4d8; 博主小档案&#xff1a; 一名来自世界500强的资深程序媛&#xff0c;毕业于国内知名985高校。 &#x1f527; 技术专长&#xff1a; 在深度学习任务中展现出卓越的能力&#xff0c;包括但不限于…

华为openEuler-22.03-LTS-SP3配置yum源

先有华为后有天&#xff0c;遥遥领先&#xff01; 1 确定使用的OS版本 # cat /etc/os-release NAME"openEuler" VERSION"22.03 (LTS-SP3)" ID"openEuler" VERSION_ID"22.03" PRETTY_NAME"openEuler 22.03 (LTS-SP3)" ANSI…

【NLP】关于BERT模型的一些认知

BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;模型是由Google在2018年提出的预训练Transformer模型&#xff0c;用于自然语言处理任务。 一. BERT模型的架构 1.1 输入表示 / Encoder模块 BERT中的Encoder模块是由三种Embedding&…

GD32F470_ DS18B20温度传感器模块移植

DS18B20温度传感器 DS18B20数字温度传感器提供9位至12位精度的温度测量&#xff0c;并具有非易失性用户可编程上下触发点报警功能。DS18B20通过单总线通信&#xff0c;根据定义&#xff0c;只需要一条数据线(和地线)即可与单片机通信。此外&#xff0c;DS18B20可以直接从数据线…

vue2开发好还是vue3开发好vue3.0开发路线

Vue 2和Vue 3都是流行的前端框架&#xff0c;它们各自有一些特点和优势。选择Vue 2还是Vue 3进行开发&#xff0c;主要取决于你的项目需求、团队的技术栈、以及对新特性的需求等因素。以下是一些关于Vue 2和Vue 3的比较&#xff0c;帮助你做出决策&#xff1a; Vue 2&#xff1…

docker安装nacos,单例模式(standalone),使用mysql数据库

文章目录 前言安装创建文件夹"假装"安装一下nacos拷贝文件夹删除“假装”安装的nacos容器生成nacos所需的mysql表获取mysql-schema.sql文件创建一个mysql的schema 重新生成新的nacos容器 制作docker-compose.yaml文件查看网站 前言 此处有本人写得简易版本安装&…

log4j 集成 ELK环境搭建

一、前言 1.需要准备一台linux服务器&#xff08;最好是CentOS7&#xff09;,内存至少4g以上&#xff08;三个组件都比较占用内存&#xff09; 2.需要有docker使用经验 3. 三个软件的版本要一致 二、安装ElasticSearch 这里先创建一个网络&#xff1a;因为我们还需要部署k…

品牌定位升级|飞雕开关如何从家庭作坊走上国际之路?

飞雕电器,这个名字在中国开关插座行业中如同一面旗帜,自1987年起就扬帆在电工领域的大海中。它不仅见证了这个行业的起起伏伏,还始终以其创新的姿态站在浪尖之上。 飞雕的产品线丰富多彩,除主营的墙壁开关插座领域外,飞雕电器还涉足了与墙壁开关紧密相关的其它领域,现已推出移…

蓝桥杯第十四届C++C组

目录 三国游戏 填充 翻转 【单调队列优化DP】子矩阵 【快速幂、欧拉函数】互质数的个数 【tire树】异或和之差 【质因数分解】公因数匹配 子树的大小 三国游戏 题目描述 小蓝正在玩一款游戏。游戏中魏蜀吴三个国家各自拥有一定数量的士兵X, Y, Z (一开始可以认为都…

Linux中安装nacos

Linux中安装nacos 一、前言二、准备1、下载2、上传到服务器3、解压 三、配置1、备份配置文件2、导入sql3、修改前4、修改后 四、使用1、启动2、关闭 一、前言 最近国外的docker似乎是出什么问题&#xff0c;试过很多手段都拉不下 nacos 镜像&#xff0c;就打算在服务器装一下 …

能否安全地删除 Mac 资源库中的文件?

在管理Mac电脑存储空间时&#xff0c;用户确实可能考虑对资源库&#xff08;Library&#xff09;文件夹进行清理以释放空间。Mac资源库是一个系统及应用程序存放重要支持文件的地方&#xff0c;其中包括但不限于配置文件、临时文件、缓存、插件、偏好设置、应用程序支持数据等。…

Rustdesk二次编译,新集成AI功能开源Gpt小程序为远程协助助力,全网首发

环境&#xff1a; Rustdesk1.1.9 sciter版 问题描述&#xff1a; Rustdesk二次编译&#xff0c;新集成AI功能开源Gpt小程序为远程协助助力,全网首发 解决方案&#xff1a; Rustdesk二次编译&#xff0c;新集成开源AI功能Gpt小程序&#xff0c;为远程协助助力&#xff0c…

【蓝桥杯嵌入式】六、真题演练(三)-2研究篇:第13届第一场真题

温馨提示&#xff1a; 真题演练分为模拟篇和研究篇。本专栏的主要作用是记录我的备赛过程&#xff0c;我打算先自己做一遍&#xff0c;把遇到的问题和不同之处记录到演练篇&#xff0c;然后再返回来仔细研究一下&#xff0c;找到最佳的解题方法记录到研究篇。题目在&#xff1a…

远程过程调用(远程调用)

远程过程调用&#xff08;远程调用&#xff09; 1、什么是分布式计算 在计算机科学中&#xff0c;分布式计算&#xff08;英语&#xff1a;Distributed computing&#xff09;&#xff0c;又译为分散式运算。这个研究领域&#xff0c;主要研究分布式系统&#xff08;Distribu…

学习周报:文献阅读+Fluent案例+水力学理论学习

目录 摘要 Abstract 文献阅读&#xff1a;物理信息的神经网络与湍流传质的非封闭机制模型相结合 文献摘要 提出问题 提出方案 实验设置 所需方程介绍 雷诺时均方程&#xff08;RANS&#xff09; K-epsilon两方程模型 神经网络框架 DNN部分 损失函数定义 PINN部分…

Francek Chen 的128天创作纪念日

目录 Francek Chen 的128天创作纪念日机缘收获日常成就憧憬 Francek Chen 的128天创作纪念日 Francek Chen 的个人主页 机缘 不知不觉的加入CSDN已有两年时间了&#xff0c;最初我第一次接触CSDN技术社区是在2022年4月的时候&#xff0c;通过学长给我们推荐了几个IT社区平台&a…

【Python】还在用print进行调试,你Out了!!!

1. 引言 Python 中最常用的函数是什么&#xff1f;像在大多数编程语言中&#xff0c;print() 函数是最常用的。我相信大多数开发者都会像我一样&#xff0c;在开发过程中多次使用它将信息进行打印。 当然&#xff0c;没有其他方法可以完全取代print()函数。不过&#xff0c;当…

c++算法学习笔记 (20) 哈希表

1.模拟散列表 // 拉链法 #include <bits/stdc.h> using namespace std; const int N 100003; int h[N]; int e[N], ne[N], idx; // 存链void insert(int x) {int k (x % N N) % N; // 让负数的余数变成正数(若直接加N,则可能溢出)e[idx] x;ne[idx] h[k];h[k] idx;…

传动设计选型

一. 齿轮选型 1齿轮传动概述 齿轮传动首先自然是一对对的&#xff0c;故也叫齿轮副。原理其实大家基本都知道&#xff0c;很多玩具中都会有齿轮传动的身影&#xff0c;比如小时候玩的四驱车。就是两齿轮互相啮合互相推动&#xff0c;然后输出旋转动力或者改变传递动力的方向&…