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=20M


nohup 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>

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言分支语句

一、什么是语句 C语句可分为以下五类&#xff1a; 表达式语句 函数调用语句 控制语句 复合语句 空语句 本周后面介绍的是控制语句。 控制语句用于控制程序的执行流程&#xff0c;以实现程序的各种结构方式&#xff0c;它们由特定的语句定义符组成&#xff0c;C语 言有…

测试工程师求职是选自研公司还是选外包公司呢?

大家好&#xff0c; 今天我们一起来聊一聊测试工程师求职是选自研公司&还是选外包公司呢&#xff1f; 今天来谈谈我的个人看法&#xff0c;作为一个在测试岗位上多年的我来说&#xff0c;自研公司比较好&#xff0c;外包公司其实也不会差。各自都有特点特色&#xff0c;根据…

虚拟主机VPS和共享服务器有什么区别?VPS和共享服务器怎么选择,VPS和云服务器区别

今天易极赞小编来跟大家科普一个新的知识“虚拟主机和云服务器有什么区别&#xff1f;”看完这篇文章后你应该就能知道虚拟主机和云服务器哪个更适合你了。 如果你不知道服务器的常见类型有哪些&#xff0c;查看下面这篇文章&#xff1a; 服务器7中常见的类型&#xff0c;服务…

刷力扣中学习使用static,final

. - 力扣&#xff08;LeetCode&#xff09;. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/throne-inheritance/今天在力扣题中第一次使用了static和final&#xf…

Ceph学习 -3.存储简介

文章目录 1.存储简介1.1 存储类型1.1.1 储备知识1.1.2 三种存储1.1.3 块存储1.1.4 文件存储1.1.5 对象存储1.1.6 三种存储之间的关系1.1.7 总结 1.2 Ceph简介1.2.1 官方介绍1.2.2 软件特点1.2.3 基本结构1.2.4 应用场景 1.3 小结 1.存储简介 学习目标&#xff1a;这一节&#x…

Shiny Items VFX for URP

一系列令人惊叹且易于编辑的Shuriken粒子系统和粒子着色器&#xff0c;用于稀有物品、奖励或通电物品 用我的“闪亮物品”包提高你在URP项目中的稀有物品、奖项或电源的吸引力。 该包提供了使用Shuriken粒子系统创建的14个“项目”预制集&#xff0c;以及项目的自定义着色图着色…

PPP-B2b星历下载

目前做PPP-B2b研究比较多&#xff0c;其中PPP-B2b需要北斗的CNAV星历下载链接为&#xff08;例如2024.04.05对应的2024年第097天&#xff09;&#xff1a;数据下载http://www.csno-tarc.cn/datacenter/ephemeris

c++ Constraints 和 concepts介绍

C++20 引入了 Concepts,以改进模板编程的体验。Concepts 是一种用于模板编程的新机制,它允许程序员在编译时对模板参数进行约束和限制,从而提高模板的可读性、可维护性和错误检测能力。 Constraints(约束)是 Concepts 的一部分,它定义了模板参数必须满足的条件。一个约束…

《科技创业月刊》是什么级别的期刊?是正规期刊吗?能评职称吗?

问题解答&#xff1a;问&#xff1a;《科技创业月刊》是什么级别的刊物&#xff1f; 答&#xff1a;省级&#xff0c;主管单位&#xff1a; 湖北省科学技术厅 &#xff1b;主办单位&#xff1a;湖北省科技信息研究院 问&#xff1a;《科技创业月刊》是c刊吗&#xff1f; 答&…

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

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

【C++】RapidJSON 设置支持 std::string,防止编译报错

问题 rapidjson 创建 json 数据&#xff0c;使用 std::string 字符串进行赋值&#xff0c;编译时&#xff0c;抱一堆错误 .... rapidjson/include/rapidjson/document.h:690:5: note: candidate expects 0 arguments, 1 provided [build] make[2]: *** [main/CMakeFiles/ma…

2024.4.7

1. 2列火车 #include<myhead.h>pthread_mutex_t m1; pthread_mutex_t m2;void* run(void* arg) {while(1){pthread_mutex_lock(&m1);printf("火车B进入\n");printf("A请等待\n");pthread_mutex_unlock(&m2);sleep(2);} }int main(in…

cookie、session、token的区别

这三者都和维持状态信息有关。比如我们如果在网页进行了一次登录&#xff0c;如果我们希望以后再访问该网页的时候&#xff0c;维持登录信息的话&#xff0c;就需要用到上面的这三种&#xff0c;如果不用的话&#xff0c;那么我们每次都需要携带登录信息到服务器&#xff0c;并…

海纳斯删除广告位

找到文件 vim /var/www/html/home.php 删除代码段 <div class"adleft" id"adleftContainer"><button onclick"closeAd()">关闭</button><a href"https://www.ecoo.top/ad.html" target"_blank">&l…

Android Studio学习16——Activity跳转时的参数传递

传递数据——example 传递对象类型的数据——example 传递 接收 回传数据——example

Docker容器(五)Docker Compose

一、概述 1.1介绍 Docker Compose是Docker官方的开源项目&#xff0c;负责实现对Docker容器集群的快速编排。Compose 是 Docker 公司推出的一个工具软件&#xff0c;可以管理多个 Docker 容器组成一个应用。你需要定义一个 YAML 格式的配置文件docker-compose.yml&#xff0c;…

风险评估在应对网络安全威胁中扮演着重要的角色

如今&#xff0c;IT 安全专家面临各种重大威胁&#xff0c;从勒索软件、网络钓鱼&#xff0c;到对基础设施的攻击&#xff0c;再到对知识产权、客户数据的窃取&#xff1b;从不安全的供应链合作伙伴&#xff0c;再到组织内部人员的恶意行为。同时&#xff0c;随着云计算、远程工…

JavaScript(二)-Web APIS

文章目录 Web API 基本认知作用和分类什么是DOMDOM树DOM对象获取DOM对象操作元素内容操作元素属性操作元素常用属性操作元素样式属性自定义属性 定时器-间歇函数定时器函数的理解定时器函数使用间歇函数 事件监听与绑定事件监听事件监听版本事件类型事件对象什么是事件对象获取…

micropython控制esp32上的LED闪烁

ESP32电路图 部分PCB原理图: https://doc.itprojects.cn/0006.zhishi.esp32/01.download/esp32_Schematic%20Prints.pdf GPIO2输出高低电平&#xff0c;控制LED。下面是控制LED灯闪烁的代码。 import machine import time pin2 machine.Pin(2, machine.Pin.OUT) while True:…

Java集合基础知识点复习

目录 Java提供的常见集合ListArrayList底层实现与扩容机制ArrayList listnew ArrayList(10)中的list扩容几次如何实现数组和List之间的转换用Arrays.asList转List后&#xff0c;如果修改了数组内容&#xff0c;list受影响吗&#xff1f;List用toArray转数组后&#xff0c;如果修…