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

news2024/11/17 8:26:43

文章目录

  • 一. 各日志概述
      • 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>

 

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

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

相关文章

linux 文件提权|属性修改

文章目录 suid&#xff08;set uid&#xff09;添加文件属性查看文件属性i &#xff08;immutable&#xff09; umask suid&#xff08;set uid&#xff09; 让文件在执行的时候具有属主&#xff08;对应文件 user &#xff09;的权限 chmod 7744 temp.txt 第一位的7表示权限位…

软件自动化测试的难点怎么解决

软件自动化测试是一种使用工具或脚本来代替人工执行测试用例的方法&#xff0c;它可以提高测试的效率和质量&#xff0c;但也存在一些挑战和问题。 总结了以下几个常见的难点和解决方案&#xff1a; 接口文档的不完整性&#xff1a;有些接口的文档没有说明清楚必要的字段、参…

深入理解数据结构第三弹——二叉树(3)——二叉树的基本结构与操作

二叉树&#xff08;1&#xff09;&#xff1a;深入理解数据结构第一弹——二叉树&#xff08;1&#xff09;——堆-CSDN博客 二叉树&#xff08;2&#xff09;&#xff1a;深入理解数据结构第二弹——二叉树&#xff08;2&#xff09;——堆排序及其时间复杂度-CSDN博客 前言…

【前端Vue】Vue3+Pinia小兔鲜电商项目第4篇:静态结构搭建和路由配置,1. 准备分类组件【附代码文档】

Vue3ElementPlusPinia开发小兔鲜电商项目完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;认识Vue3&#xff0c;使用create-vue搭建Vue3项目1. Vue3组合式API体验,2. Vue3更多的优势,1. 认识create-vue,2. 使用create-vue创建项目,1. setup选项的写法和执行…

C语言解决汉诺塔问题

背景 首先带大家了解一下汉诺塔问题 汉诺塔是一个典型的函数递归问题&#xff0c;汉诺塔描述了这样的场景&#xff0c;有三个柱子&#xff0c;A,B,C&#xff0c;A柱为起始柱&#xff0c;在A柱上面有若干大小不同的盘子&#xff0c;最下面的最大&#xff0c;最上面的最小&#x…

Linux系统下安装ElasticSearch

一、228环境ES使用安装 1、检验ES服务是否安装成功的方法 &#xff08;1&#xff09;查看Elasticsearch进程是否成功 ps -ef|grep elasticsearch &#xff08;2&#xff09;linux elasticsearch下访问&#xff08;curl带认证访问&#xff09; curl --user elastic:Zhes.13…

CSS面试题常用知识总结day03

大家好我是没钱的君子下流坯&#xff0c;用自己的话解释自己的知识 前端行业下坡路&#xff0c;甚至可说前端已死&#xff0c;我还想在前段行业在干下去&#xff0c;所以从新开始储备自己的知识。 从CSS——>Javascript——>VUE2——>Vuex、VueRouter、webpack——>…

STM32F103C8T6-CAN

本文内容 HAL库下printf重定向解决问题&#xff1a;Keil下调试可以正常运行&#xff0c;而下载后运行不了CAN总线的回环测试&#xff0c;自发自收 printf重定向 实现printf重定向的目的是方便调试&#xff0c;通过UART查看打印的调试信息。 下面以STM32F103C8T6为例&#xf…

【前沿模型解析】潜在扩散模 1 | LDM第一阶段-感知图像压缩总览

文章目录 0 开始~1 感知压缩的目的2 自回归编码器-解码器生成模型一览2.1 AE 自编码器2.2 VAE 变分自编码器2.3 VQ-VAE2.4 VQ-GAN 3 代码部分讲解总览 0 开始~ 从今天起呢&#xff0c;我们会剖析LDM&#xff08;潜在扩散模型&#xff09; 从去年开始&#xff0c;大量的生成模…

数学建模-------MATLAB分支循环断点调试

1.if语句 &#xff08;1&#xff09;分段函数的引入&#xff08;这里的数据表示的是分数的不同区间对应的等级&#xff09; (1)这个就是一个十分简单的if语句&#xff0c;无论是if还是elseif后面都是不能添加任何分号的&#xff0c;这个例子就是一个分段的函数&#xff0c;在不…

基础总结篇:Activity生命周期

private int param 1; //Activity创建时被调用 Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.i(TAG, “onCreate called.”); setContentView(R.layout.lifecycle); Button btn (Button) findViewById(R.id.…

医药行业痛点以及OKR解决方案

一、背景 随着医药行业的快速发展和市场竞争的加剧&#xff0c;企业面临着前所未有的挑战和机遇。为了在激烈的市场竞争中立于不败之地&#xff0c;某知名医药企业决定引入OKR&#xff08;Objectives and Key Results&#xff0c;目标与关键成果&#xff09;管理模式&#xff0…

Gradle入门初探

一、Gradle简介&#xff1a; 我们都创建过基于Maven的项目&#xff0c;maven可以很好的管理项目的依赖&#xff0c;编译和打包项目&#xff0c;Gradle是一个和Maven类似的自动化构建工具&#xff0c;Maven是基于xml文件格式&#xff0c;而Gradle是基于Groovy的语言&#xff0c…

dm8数据迁移工具DTS

dm8数据迁移工具DTS DTS工具介绍 DM数据迁移工具提供了主流大型数据库迁移到DM、DM到DM、文件迁移到DM以及DM迁移到文件的功能。DM数据迁移工具采用向导方式引导用户通过简单的步骤完成需要的操作。 DM数据迁移工具支持&#xff1a; ◆ 主流大型数据库Oracle、SQLServer、MyS…

Advanced RAG 01:讨论未经优化的 RAG 系统存在的问题与挑战

编者按&#xff1a; 自 2023 年以来&#xff0c;RAG 已成为基于 LLM 的人工智能系统中应用最为广泛的架构之一。由于诸多产品的关键功能严重依赖RAG&#xff0c;优化其性能、提高检索效率和准确性迫在眉睫&#xff0c;成为当前 RAG 相关研究的核心问题。 我们今天为大家带来的这…

【无标题】【Android】Android中Intent的用法总结

2.显示地图: Java代码 Uri uri Uri.parse(“geo:38.899533,-77.036476”); Intent it new Intent(Intent.Action_VIEW,uri); startActivity(it); 3.从google搜索内容 Java代码 Intent intent new Intent(); intent.setAction(Intent.ACTION_WEB_SEARCH); intent.pu…

SAP操作教程第16期:SAP B1关于审批模块的设置

工作效率是企业的生存之本&#xff0c;也是员工能够在企业中发展之本。自动化和规范化的审批流程可以减少手动操作以及沟通环节、节约时间和资源从而提高工作效率。 所以&#xff0c;今天我们就一起来了解一下SAP B1中关于审批模块的设置。 01关于审批模块的设置 第一步&#x…

数据结构基础:双链表结构、实现

继续和颦颦学C语言呀.......> 双链表的结构 这里的head 为头节点&#xff0c;是‘哨兵位’&#xff0c;实际不存储任何有效的数据 它的存在是为了遍历环链表避免死循环 双链表的实现 typedef int LTDataType; typedef struct ListNode { struct ListNode* next; //指针保存…

为什么使用MQ????

1、异步处理 场景说明&#xff1a;用户注册后&#xff0c;需要发注册邮件和注册短信,传统的做法有两种 1.串行的方式 2.并行的方式。 串行方式: 将注册信息写入数据库后,发送注册邮件,再发送注册短信,以上三个任务全部完成后才返回给客户端。 这有一个问题是,邮件,短信并不是…

2024/4/1—力扣—二叉树的最近公共祖先

代码实现&#xff1a; 思路&#xff1a; 递归判断左子树和右子树&#xff0c;查找p或者q是否在当前节点的子树上 1&#xff0c;在同一子树上&#xff0c;同一左子树&#xff0c;返回第一个找到的相同值&#xff0c;同一右子树上&#xff0c;返回第一个找到的相同值 2&#xff0…