• 2023-07-24PerfView 洞察C#托管堆内存 "黑洞现象"
    一:背景1.讲故事首先声明的是这个黑洞是我定义的术语,它是用来表示内存吞噬的一种现象,何为内存吞噬,我们来看一张图。从上面的卦象图来看,GCHeap的Allocated=852M和Committed=16.6G,它们的差值就是分配缓冲区=16G,缓冲区的好处就是用空间换时间,弊端就是会实实在在的侵
  • 2023-07-21PerfView专题 (第十五篇): 如何洞察 C# 中的慢速方法
    一:背景1.讲故事在dump分析旅程中,经常会遇到很多朋友反馈一类问题,比如:方法平时都执行的特别快,但有时候会特别慢,怎么排查?我的方法第一次执行特别慢,能看到慢在哪里吗?相信有朋友肯定说,加些日志不就好了,大方向肯定是没问题的,但加日志的颗粒度会比较粗而且侵入性也比较大,比如
  • 2023-07-19PerfView专题 (第十四篇): 洞察那些 C# 代码中的短命线程
    一:背景1.讲故事这篇文章源自于分析一些疑难dump的思考而产生的灵感,在dump分析中经常要寻找的一个答案就是如何找到死亡线程的生前都做了一些什么?参考如下输出:0:001>!tThreadCount:22UnstartedThread:0BackgroundThread:1PendingThread:0DeadThread:
  • 2023-07-01使用火焰图分析.NET的 start-up 期间花费的时间
    本文将告诉你从“dotnetrun”到“helloworld”,如何使用PerfView来分析.NET运行时在启动期间所花费的时间。代码示例在这个示例中,我故意只关注.NET运行时在程序启动(start-up)过程中的操作,以确保运行的用户代码最少,因此只有以下的“HelloWorld”:usingSystem;namespace
  • 2022-08-28PerfView专题 (第十二篇):对 C# 下的 SDK 类库进行监控(大结局)
    一:背景本篇是我们系列文章的最后一篇,前面的文章中大多是在CLRRuntime以及OS层面进行监控来发现各种可疑的程序问题,除了这两个层面,其实我们还可以对SDK中一些类进行
  • 2022-08-25PerfView专题 (第十一篇):使用 Diff 功能洞察 C# 内存泄漏增量
    一:背景去年GC架构师Maoni在(2021.NET开发者大会)[https://ke.segmentfault.com/course/1650000041122988/section/1500000041123017]上演示过PerfView的Diff
  • 2022-08-24PerfView专题 (第十篇):洞察 C# 终结队列引发的内存泄漏
    一:背景C#程序内存泄漏的诱发因素有很多,但从顶层原理上来说,就是该销毁的用户根对象没有被销毁,从而导致内存中意料之外的对象无限堆积,导致内存暴涨,最终崩溃,这其中的一个
  • 2022-08-22PerfView专题 (第八篇):洞察 C# 内存泄漏之寻找静态变量名和GC模式
    一:背景这篇我们来聊一下PerfView在协助WinDbg分析Dump过程中的两个超实用技巧,可能会帮助我们快速定位最后的问题,主要有如下两块:洞察内存泄漏中的静态大集合变量
  • 2022-08-17PerfView专题 (第六篇):如何洞察 C# 中 GC 的变化
    一:背景在洞察GC方面,我觉得市面上没有任何一款工具可以和PerfView相提并论,这也是为什么我会在WinDbg之外还要学习这么一款工具的原因,这篇我们先简单聊聊PerfView到
  • 2022-08-16PerfView专题 (第五篇):如何寻找 C# 托管内存泄漏
    一:背景前几篇我们聊的都是非托管内存泄漏,这一篇我们再看下如何用PerfView来排查托管内存泄漏,其实托管内存泄漏比较好排查,尤其是用WinDbg,毕竟C#是带有丰富的元数据
  • 2022-08-15PerfView专题 (第四篇):如何寻找 C# 中程序集泄漏
    一:背景前两篇我们都聊到了非托管内存泄漏,一个是HeapAlloc,一个是VirtualAlloc,除了这两种泄漏之外还存在其他渠道的内存泄漏,比如程序集泄漏,这一篇我们就来聊一聊。二:程
  • 2022-08-14PerfView专题 (第三篇):如何寻找 C# 中的 VirtualAlloc 内存泄漏
    一:背景上一篇我们聊到了如何用PerfView去侦察NTHeap的内存泄漏,这种内存泄漏往往是用C的malloc或者C++的new分配而不释放所造成的,这一篇我们来聊一下由Virtua