聊一聊 .NET高级调试 中的一些内存术语

这篇具有很好参考价值的文章主要介绍了聊一聊 .NET高级调试 中的一些内存术语。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一:背景

1. 讲故事

在高级调试的旅程中,经常会有一些朋友问我什么是 工作集(内存),什么是 提交大小,什么是 Virtual Size, 什么是 Working Set 。。。截图如下:

聊一聊 .NET高级调试 中的一些内存术语

既然有很多朋友问,这些用口头也不怎么好描述,刚好上午有时间就系统的聊一下吧。

二:内存术语解读

1. Virtual Size 是什么

可能有些朋友知道,内存中的虚拟地址被划分成了三类。

  • Reserved (预定地址)
  • Committed (提交地址)
  • Free (蛮荒地址)

上面的 预定+提交 就是我们的 Virtual Size,即 Virtual Size = Reserved + Committed

当然口说无凭,得要拿出证据,写一个 x86 的 C# 测试代码,参考如下:


        static void Main(string[] args)
        {
            Console.WriteLine("hello world!");
            Console.ReadLine();
        }

将程序跑起来后用 windbg 附加,使用 !address -summary 将计算出的内存和 Process Explorer 工具显示的 Virtual Size 进行对比,截图如下:

聊一聊 .NET高级调试 中的一些内存术语

有些较真的朋友可能说:Explorer 显示出的是 163.300,而 windbg 显示的是 163.281 ,为什么还差一点点,其实这是不同工具的统计误差,仅此而已。

2. Working Set

有些朋友可能知道,一个程序所占的内存最终会在三个地方落地:

  • 物理内存条
  • 虚拟内存 pagefile
  • 物理文件 MappedFile

这里的 Workding Set 特指的就是 物理内存条 ,由于 Windows 有 MappedFile 这种文件映射(内存共享)机制,所以物理内存条上的内存可以进一步划分为 自己独占的 + 大家共享的,可能有些朋友比较蒙,截个图如下:

聊一聊 .NET高级调试 中的一些内存术语

有了这张图的基础,转化为专业术语就是:

  • Workding Set = WS Private + WS Shareable

最后我们还是用 Explorer 观察下刚才的 C# 程序,截图如下:

聊一聊 .NET高级调试 中的一些内存术语

3. Private Bytes

刚才我们说到了内存最终会落地到三个地方,其中一个地方就是 虚拟内存(pagefile),简而言之它的作用就是给物理内存打辅助,这个 pagefile.sys 默认是在 C 盘上,截图如下:

聊一聊 .NET高级调试 中的一些内存术语

有了这些基础,就可以列出一个公式了。

  • Private Bytes = WS Private + Pages Out (pagefile)

上面的 Pages Out 是我定义的换页内存,这个 Private Bytes 指标在分析内存泄露的场景下特别有用,它能够准备的洞察当前程序是否存在大量的 Pages Out(换页内存)

为了方便演示出现了大量的换页内存,写一个不断灌数据的例子。


    internal class Program
    {
        static void Main(string[] args)
        {
            var list = new List<string>();

            for (int i = 0; i < 100000000; i++)
            {
                list.Add(string.Join(",", Enumerable.Range(0, 100000)));

                if (i % 10000 == 0) { Console.WriteLine($"i={i}"); }
            }
            Console.WriteLine("成功!");

            Console.ReadLine();
        }
    }

将程序跑起来后,截图如下:

聊一聊 .NET高级调试 中的一些内存术语

根据刚才的计算公式:Pages Out = Private Bytes - WS Private ,可以得知大概有 29G 不得不存放在 pagefile 中。

本来想用 wmic pagefile get /value 看一下当前机器的虚拟内存占用,发现有时候不准,我也没太深究了,输出如下:


C:\Users\Administrator>wmic pagefile get /value

AllocatedBaseSize=49464
Caption=C:\pagefile.sys
CurrentUsage=1473
Description=C:\pagefile.sys
InstallDate=20230807095038.481750+480
Name=C:\pagefile.sys
PeakUsage=1640
Status=
TempPageFile=FALSE

不过可以看到,这个 pagefile.sys 已经从刚开始的 4.8G 暴涨到 49G 了,其中一大半都被我的程序吞掉了。

4. WS Shared

这个也是很多朋友会问的,WS ShareableWS Shared 到底有什么区别,从字面意思上看就是:一个可被多个进程共享的内存页集合中,当前已经被共享的内存页集合。

可能这么说大家有点懵逼,不过没关系,可以借助 VMMap 工具观察。

  1. 开启一个 ConsoleApp6 进程观察

聊一聊 .NET高级调试 中的一些内存术语

从图中可以看到 Shareable=104k,而 Shared=0k ,这是什么意思呢? 由于 ConsoleApp6.exe 是文件映射到内存的,占用了 104k 的物理内存,此时没有其他进程共享这一块物理内存,所以此时为Shared=0,要想把这里的 Shared 也给填充起来,最简单的办法就是开启多个ConsoleApp6实例。

  1. 开启多个 ConsoleApp6 进程观察

接下来反复点击 ConsoleApp6 生成多个实例,再次使用 VMMap 观察,截图如下:

聊一聊 .NET高级调试 中的一些内存术语

三:总结

我尽最大努力通过多个观察工具用眼见为实的方式把这几个内存指标系统的说了一下,希望大家对这几个术语不再迷茫,以后有人问类似问题就可以把这篇丢过去,减轻了你我负担...文章来源地址https://www.toymoban.com/news/detail-748132.html

聊一聊 .NET高级调试 中的一些内存术语

到了这里,关于聊一聊 .NET高级调试 中的一些内存术语的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 聊一聊 Valgrind 监视非托管内存泄露和崩溃

    只要是程序总会出现各种莫名其妙的问题,比如:非托管内存泄露,程序崩溃,在 Windows 平台上一般用微软自家的官方工具 App Verifier 就可以洞察,那问题出在 Linux 上怎么办呢?由于 Linux 崇尚自由,需要在各种牛鬼蛇神写的非官方开源软件中寻找一个比较靠谱的,比如本篇所

    2024年02月02日
    浏览(44)
  • 聊一聊 GDB 调试程序时的几个实用命令

    用惯了宇宙第一的 Visual Studio 再用其他的开发工具还是有一点不习惯,不习惯在于想用的命令或者面板找不到,总的来说还是各有千秋吧,今天我们来聊一下几个在调试中比较实用的命令: 查看内存 硬件断点 虚拟内存布局 相信大家都知道 Visual Studio 直接提供了 Memory 面板来

    2024年02月02日
    浏览(11)
  • Net 高级调试之一:开始认识一些调试工具

    一、简介 从今天开始一个长系列,Net 高级调试的相关文章,我自从学习了之后,以前很多模糊的地方现在很清楚了,原来自己的功力还是不够,所以有很多不明白,通过学习 Net 高级调试,眼前豁然开朗,茅塞顿开。其实,刚开始要学习《Net 高级调试》,还是很是很困难的

    2024年02月08日
    浏览(13)
  • 聊一聊 tcp/ip 在.NET故障分析的重要性

    这段时间分析了几个和网络故障有关的 .NET程序 之后,真的越来越体会到计算机基础课的重要,比如 计算机网络 课,如果没有对 tcpip协议 的深刻理解,解决这些问题真的很难,因为你只能在高层做黑盒测试,你无法看到 tcp 层面的握手和psh通讯。 这篇我们通过两个小例子来

    2024年02月05日
    浏览(22)
  • 聊一聊mysql中的间隙锁

    间隙锁在mysql中经常使用到,今天就聊一聊mysql的间隙锁的内容。 间隙锁是为了解决幻读的问题,并且在当前读的场景下解决的。 当前读包含:update,delete,insert,select…lock in share mode,select…for update 一基本概念 1、行锁:给某一行进行加锁 2、间隙锁:两个值之间的间隙,为解

    2024年02月12日
    浏览(12)
  • 深入聊一聊vue3中的reactive()

      在vue3的开发中,reactive是提供实现响应式数据的方法。日常开发这个是使用频率很高的api。这篇文章笔者就来探索其内部运行机制。小白一枚,写得不好请多多见谅。 调试版本为 3.2.45 什么是reactive? reactive是Vue3中提供实现响应式数据的方法. 在Vue2中响应式数据是通过 defi

    2024年02月01日
    浏览(14)
  • 一文带你快速掌握爬虫开发中的一些高级调试技巧

      做过爬虫开发的人都知道,浏览器的开发者工具基本是离不开的,有时候在准备开发一个web爬虫的时候,往往最先开始的就是打开浏览器开发者工具进行请求、参数、响应…的分析。用好了确实是可以大大的帮我们提高调试代码的效率! 本文将介绍几个高级的工具使用技

    2024年02月08日
    浏览(18)
  • 聊一聊 TLS/SSL

    哈喽大家好,我是咸鱼 当我们在上网冲浪的时候,会在浏览器界面顶部看到一个小锁标志,或者网址以 \\\"https://\\\" 开头 这意味着我们正在使用 TLS/SSL 协议进行安全通信。虽然它可能看起来只是一个小小的锁图标和一个 “https” ,但实际上,这个协议在保护我们的在线隐私和安

    2024年02月08日
    浏览(15)
  • 聊一聊synchronized

    在 Java 中, synchronized 可以用于实现线程同步,有以下几种常见的使用方式: 修饰代码块:将 synchronized 放在代码块的前面, 例如: 在这种方式下,会为给定的对象 obj 获取锁,在代码块执行期间,只有持有该锁的线程才能进入代码块执行。 修饰方法:将 sync

    2024年01月22日
    浏览(18)
  • 聊一聊大模型

    事情还得从ChatGPT说起。 2022年12月OpenAI发布了自然语言生成模型ChatGPT,一个可以基于用户输入文本自动生成回答的人工智能体。它有着赶超人类的自然对话程度以及逆天的学识。一时间引爆了整个人工智能界,各大巨头也纷纷跟进发布了自家的大模型,如:百度-文心一言、科

    2024年02月05日
    浏览(19)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包