一:背景
在洞察 GC 方面,我觉得市面上没有任何一款工具可以和 PerfView 相提并论,这也是为什么我会在 WinDbg 之外还要学习这么一款工具的原因,这篇我们先简单聊聊 PerfView 到底能洞察 GC 什么东西?
二:洞察 GC
1. 到底都能看到 GC 什么?
能获取到的 GC 信息非常多,比如:
-
程序运行期间 GC 触发了多少次?
-
GC 最大一次暂停耗费了多久?
-
每一次 GC 触发的原因是什么?
-
GC 暂停 >200ms 的都有哪些?
-
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 的触发情况。
稍等20s
后,在打包好的 zip 视图列表中点击 Memory -> GCStats
。
然后点击我们的应用程序,就会看到 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
列表,如下图所示:
从图中可得知这 20s 期间的如下信息:
-
GC触发了
1w
次,平均500次/s
,查看更多关于【C#教程】的文章
- 使用C#编写一个.NET分析器(一) 使用csv模块的什么方法可以一次性将一行数据写入文件
0评论2023-03-08
- 跨语言调用C#代码的新方式-DllExport 跨语言调用本质
0评论2023-03-08
- 我比较了 Go 和 C# 的速度
0评论2023-03-08
- [C#]使用 AltCover 获得代码覆盖率 - E2E Test 和 Unit Test
0评论2023-02-09
- C#中LINQ的Select与SelectMany函数如何使用 c反应蛋白高说明什么
0评论2023-02-09
- PerfView专题 (第三篇):如何寻找 C# 中的 VirtualAlloc 内存泄漏
0评论2023-02-09
- Blazor和Vue对比学习(知识点杂锦3.04):Blazor中C#和JS互操作(超长文)
0评论2023-02-09
0评论2023-02-09664
- C#如何实现折半查找算法 彩票查询
0评论2023-02-09
- C#如何实现选择排序 c罗
0评论2023-02-09
- PerfView专题 (第四篇):如何寻找 C# 中程序集泄漏
0评论2023-02-09
- PerfView专题 (第五篇):如何寻找 C# 托管内存泄漏
0评论2023-02-09
- C# 创建标签PDF文件 茶杯狐
0评论2023-02-09
0评论2023-02-09694
- Chapter 09 - NSUndoManager (C#实现 + 全网原创)
0评论2023-02-09
0评论2023-02-09645
- PerfView专题 (第七篇):如何洞察触发 GC 的 C# 代码?
0评论2023-02-09
- PerfView专题 (第八篇):洞察 C# 内存泄漏之寻找静态变量名和GC模式
0评论2023-02-09
- PerfView专题 (第九篇):洞察 C# 中的 LOH 内存碎片化
0评论2023-02-09