PerfView专题 (第六篇):如何洞察 C# 中 GC 的变化

一:背景

在洞察 GC 方面,我觉得市面上没有任何一款工具可以和 PerfView 相提并论,这也是为什么我会在 WinDbg 之外还要学习这么一款工具的原因,这篇我们先简单聊聊 PerfView 到底能洞察 GC 什么东西?

二:洞察 GC

1. 到底都能看到 GC 什么?

能获取到的 GC 信息非常多,比如:

  1. 程序运行期间 GC 触发了多少次?

  2. GC 最大一次暂停耗费了多久?

  3. 每一次 GC 触发的原因是什么?

  4. GC 暂停 >200ms 的都有哪些?

  5. GC 触发 3 阶段中各个函数的耗时是怎样的?

等等。。。可获取的信息非常多,后面的文章会逐一聊。

2. 获取 GC 的一般性信息

为了方面讲述,先上一段故意无限次拼接 string 的代码,让 GC 高频触发。

internal class Program{static void Main(string[] args){Task.Run(Alloc1);Console.ReadLine();}static void Alloc1(){var s = string.Empty;for (int i = 0; i < 100000; i++){s = s + i.ToString();}}}

接下来我们用 Collect -> Run 对程序采样 20s,观察这 20s 中 GC 的触发情况。

67745e21f4ac412011c8373951aad653.png

稍等20s后,在打包好的 zip 视图列表中点击 Memory -> GCStats

e273c190934f4a9a38c125a4675f08b9.png

然后点击我们的应用程序,就会看到 GC 汇总信息。

GC Stats for Process 3848: ConsoleApp10•CommandLine: "D:\net6\ConsoleApp1\ConsoleApp10\bin\Debug\net6.0\ConsoleApp10.exe"
•Runtime Version: V 6.0.522.21309 (built on 2022/4/14 1:31:32)
•CLR Startup Flags: 8388611
•Total CPU Time: 10,471 msec
•Total GC CPU Time: 1,305 msec
•Total Allocs : 38,099.086 MB
•GC CPU MSec/MB Alloc : 0.034 MSec/MB
•Total GC Pause: 2,710.6 msec
•% Time paused for Garbage Collection: 19.9%
•% CPU Time spent Garbage Collecting: 12.5%
•Max GC Heap Size: 14.285 MB
•Peak Process Working Set: 40.776 MB
•Peak Virtual Memory Usage: 5,003.682 MB
...

接下来看下 GC Rollup By Generation 列表,如下图所示:

be2e7da4673a2913b22dc6912cf61926.png

从图中可得知这 20s 期间的如下信息:

  • GC触发了 1w 次,平均 500次/s,🐂哈

  • GC总的暂停时间是 2.7s,占比 13.5% ,也就是说20s时间,程序其实就跑了 86.5% 的时间,有点像 公摊面积 哈, 其实这是有问题的。

  • 1w 次GC 中,最大的单次暂停时发生在 gen0 上,耗费了 2.6ms。

还有一个比较有用的是 Pause > 200 Msec GC Events  列表,它记录着那些暂停时间大于 >200ms 的单次GC,截图如下:

9f860829d2fb54fa550378e6e4610fea.png

还好本次实验没有遇到,不过可以肯定的是,大于 200ms 的程序暂停肯定会导致明显的卡顿,所以仔细研读下这些 列信息 非常有用,是不是因为 存活对象过多 导致的 mark_phase 和 compact_phase 时间过长?还是因为 pinned 或者 碎片化过多导致 plan_phase 时间过长等等,具体问题具体分析。

接下来就是这 10956 次 GC 的 detail 信息啦,可以观察到 GC 的触发原因,触发了哪一代 GC,SuppendEE 暂停时间,GC 暂停时间,GC 与上次 GC 之后的一个时间占比 等等各种信息,大家可以把鼠标放在标头上,都有相应的提示。

outside_default.png

稍微提醒下就是 Pause Start 是没有解释的,其实它是一个毫秒时间戳,如果你仔细观察,也就是 500次/s 的排序记录。

3. 获取 GC 内部函数的 一般性耗时

熟悉 GC 的朋友应该知道,最简单的非并发工作站模式 GC 是这样的一个触发模式,如下代码所示:

GarbageCollectGeneration(){SuspendEE();garbage_collect();RestartEE();}garbage_collect(){generation_to_condemn();gc1();}gc1(){mark_phase();plan_phase();}plan_phase(){// actual plan phase work to decide to // compact or notif (compact){relocate_phase();compact_phase();}elsemake_free_lists();}

那如何用 PerfView 去检测这些函数的耗时呢?可以是可以,但只是一个大体的模型,因为原理是对 CPU 进行采样 再根据权重算出来的,所以有一定的参考意义。

接下来我们在 Find 输入框中搜索 coreclr!GarbageCollectGeneration  关键词。

cb94507ebab2663d3ba8670456fe2d23.png

接下来右键选择 Goto -> Goto Item in Callees 选项,然后展开可能的耗时,如下图所示:

e7e4e1216061e4d703461c6a4f988e7d.png

从输出信息看, GarbageCollectGeneration 大概会耗时 12.2ms ,耗时比较长的两块大概是:

  1. GCScanRoots

在标记阶段,爬线程栈耗时相对较大,耗费了 3.8ms,继续往下翻的话,会发现都耗费在寻找 GC 安全点上。

outside_default.png
  1. relocate_phase

这个属于 计划阶段 的重定位阶段,主要用来修改需要移动对象的新地址,所谓 兵马未动,粮草先行

f7531a6347a6e0d015459e745306abe7.png

关于 GC 的洞察,还有更多好玩的东西,放在后续文章聊吧!

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

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

相关文章

Linux_日志管理介绍(一)

一、介绍1、CentOS 6.x中日志服务已经由rsyslogd取代了原先的syslogd服务&#xff0c;但是rsyslogd是和syslogd服务相兼容的2、除了系统默认的日志之外&#xff0c;采用RPM方式安装的系统服务也会默认把日志记录在/var/log/目录中&#xff08;源码包安装的服务日志是在源码包指…

如何将exe文件添加到开机启动

1、先创建exe文件的快捷方式 2、打开windows的startup启动目录&#xff08;针对win10以上&#xff09; windows有两个以上startup目录&#xff0c;一个是针对所有用户有效的&#xff0c;另外是每个用户下边有一个&#xff1a; 针对当前用户 &#xff1a; C:\Users\{当前用户}\A…

.NET MAUI 跨平台应用程序 (Windows App 和 Android )示例

也就前周&#xff0c;.Net MAUI正式版出来了 &#xff0c;一个支持跨平台的UI框架,Linux支持情况官网也没说&#xff0c;按理来说应该也是支持的&#xff0c;刚好&#xff0c;我最近也在研究GUI的基本原理&#xff0c;微软出品还是值得深入研究一下的&#xff0c;就先来个样例&…

OpenStack 计算节点删除

前提 计算节点中一个僵尸计算节点存在&#xff0c;而里面的CPU数目在总物理CPU中&#xff0c;导致认为当前能创建实例。而实际没有这么多资源。其中node-11为僵尸节点。 原因 删除计算节点不能直接格式化该服务器&#xff0c;否则在控制节点的数据库上会存在该计算节点的数据。…

PHP 7.2 新功能介绍

PHP 7.2 已經在 2017 年 11 月 30 日 正式發布 。這次發布包含新特性、功能&#xff0c;及優化&#xff0c;以讓我們寫出更好的代碼。在這篇文章裡&#xff0c;我將會介紹一些 PHP 7.2 最有趣的語言特性。 你可以在 Requests For Comments 頁面查看完整的更動清單。 核心改进 参…

如何打造单文件 Blazor Server 应用

前言上次&#xff0c;我们介绍了《如何打造单文件前后端集成 ASP.NET Core 应用》。但是&#xff0c;网友说&#xff0c;对于 Blazor Server 项目此方法无效。于是&#xff0c;我们测试了一下&#xff1a;BlazorApp1.csproj<Project Sdk"Microsoft.NET.Sdk.Web"&g…

Android线程池详解

引入线程池的好处 1&#xff09;提升性能。创建和消耗对象费时费CPU资源 2&#xff09;防止内存过度消耗。控制活动线程的数量&#xff0c;防止并发线程过多。 我们来看一下线程池的简单的构造 [html] view plaincopy print?public ThreadPoolExecutor(int corePoolSize, …

win11下vscode 自动升级失败 There was an error while marking a file for deletion

当升级vscode时出现下方报错&#xff1a; There was an error while marking a file for deletion:Failed to mark file for deletion:拒绝访问.Please verify there are no Visual Studio Code processes still executing既然是“拒绝访问”应该是权限问题&#xff0c;关闭vsc…

盘点大厂的那些开源项目 - 哔哩哔哩

哔哩哔哩现为中国年轻世代高度聚集的文化社区和视频平台&#xff0c;被粉丝们亲切地称为“B站”。overlord分类&#xff1a;缓存服务解决方案开发语言&#xff1a;GOOverlord是哔哩哔哩基于Go语言编写的memcache和redis&cluster的代理及集群管理功能&#xff0c;致力于提供…

单元测试,到底什么是单元测试,为什么单测这么难写

很多小伙伴想知道单测到底该怎么写&#xff0c;于是&#xff0c;文章就来了&#xff01; 话不多说&#xff0c;发车&#xff01; 来源于yes的练级攻略 &#xff0c;作者是Yes呀 到底什么是单元测试 这个问题看似非常简单&#xff0c;单元测试嘛&#xff0c;不就是咱们开发自己…

Linux 学习和教训

今天在学习Linux的时候&#xff0c;突然脑抽风&#xff0c;在根目录下执行了这样一条命令rm -rf *当时就觉得空气凝固了。。。那时也没有想到可以用数据恢复软件恢复。直接就重启了。重启之后发现&#xff0c;就去就直接是grub>晕菜。。突然间想到可以时候救援模式&#xff…

WinForm(八)窗体,窗体

我们在控件那篇文章里说过&#xff0c;窗体和控件都是一个类&#xff0c;项目中一个个窗体&#xff0c;都是Form类的子类。关于这个类有几个重要的成员&#xff0c;也是最常用成员&#xff0c;以供初学者了解&#xff1a;Load事件&#xff1a;发生在构造函数后&#xff0c;Show…

java8

实验总结 没问题 代码托管 https://git.oschina.net/shuoge/java8 转载于:https://www.cnblogs.com/haha-23333/p/6875325.html

抓包工具fiddler和wireshark对比

了解过网络安全技术的人都知道一个名词“抓包”。那对于局外人&#xff0c;一定会问什么是抓包&#xff1f;考虑到&#xff0c;大家的技术水平不一&#xff0c;我尽可能用非专业的口吻简单的说一下。 抓包就是将网络传输发送与接收的数据包进行截获、重发、编辑、转存等操作&am…

你被大数据“杀熟”过吗?怎么解决的?丨Q言Q语

点击关注 InfoQ&#xff0c;置顶公众号 接收程序员的技术早餐网友“廖师傅廖师傅”表示&#xff0c;他经常通过某网站订某个特定酒店的房间&#xff0c;长年价格在 380 元 -400 元。偶然一次&#xff0c;他从前台得知酒店淡季的价格在 300 元上下。他用朋友的账号查询也是 300 …

Blazor VS Vue

Vue——两分钟概述Vue 是一个JavaScript 框架。在其最简单的模式中&#xff0c;您可以简单地将核心 Vue 脚本包含在您的应用程序中&#xff0c;然后开始构建您的组件。除此之外&#xff0c;对于更复杂的应用程序&#xff0c;您可以使用 Vue 自己的 CLI 创建&#xff08;并最终发…

SAP ECC EHP7 RFC 发布成WebService

http://www.cnblogs.com/mingdashu/p/6877622.html 1、说明介绍 本文将RFC发布成WebService的详细步骤 不介绍如何创建rfc。 2、WebService创建 2.1、调用创建命令 在RFC界面点击 实用程序-->更多实用程序-->创建WEB服务-->来自函数模块 2.2、定义Web Service 2.2.1、…

一文把RabbitMQ讲透了,佩服!

目录 背景 消息队列 | 消息队列模式 ①点对点模式 ②发布/订阅模式 | 衡量标准 RabbitMQ 原理初探 | 基本概念 | 工作原理 | 常用交换器 | 消费原理 | 高级特性 ①过期时间 ②消息确认 ③持久化 ④死信队列 ⑤延迟队列 | 特性分析 RabbitMQ 环境搭建 Rabbi…

完美完全卸载Oracle 11g数据库

Oracle 11g可在开始菜单中卸载&#xff0c;然后同时需要删除注册表中相关内容。 操作系统&#xff1a;windows10专业版。 卸载步骤&#xff1a; 1、停用oracle服务&#xff1a;进入计算机管理&#xff0c;在服务中&#xff0c;找到oracle开头的所有服务&#xff0c;右击选择停止…

【LeetCode】链表精选11题

目录 快慢指针&#xff1a; 1. 相交链表&#xff08;简单&#xff09; 2. 环形链表&#xff08;简单&#xff09; 3. 快乐数&#xff08;简单&#xff09; 4. 环形链表 II&#xff08;中等&#xff09; 5. 删除链表的倒数第 N 个节点&#xff08;中等&#xff09; 递归迭…