一:背景

1. 讲故事

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

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

二:内存术语解读

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 进行对比,截图如下:

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

2. Working Set

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

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

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

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

  • Workding Set = WS Private + WS Shareable

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

3. Private Bytes

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

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

  • 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();
}
}

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

根据刚才的计算公式: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 进程观察

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

  1. 开启多个 ConsoleApp6 进程观察

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

三:总结

我尽最大努力通过多个观察工具用眼见为实的方式把这几个内存指标系统的说了一下,希望大家对这几个术语不再迷茫,以后有人问类似问题就可以把这篇丢过去,减轻了你我负担...

聊一聊 .NET高级调试 中的一些内存术语的更多相关文章

  1. Linux高级调试与优化——内存管理

    1.物理地址和虚拟地址 Linux采用页表机制管理内存,32位系统中页大小一般为4KB,物理内存被划分为连续的页,每一个页都有一个唯一的页号. 为了程序的的可移植性,进程往往需要运行在flat mem ...

  2. IDA动态调试技术及Dump内存

    IDA动态调试技术及Dump内存 来源 https://blog.csdn.net/u010019468/article/details/78491815 最近研究SO文件调试和dump内存时,为了完 ...

  3. Linux高级调试与优化——gdb调试命令

    番外 2019年7月26日至27日,公司邀请<软件调试>和<格蠹汇编——软件调试案例集锦>两本书的作者张银奎老师进行<Linux高级调试与优化>培训,有幸聆听张老师 ...

  4. .NET高级调试系列-Windbg调试入门篇

    Windbg是.NET高级调试领域中不可或缺的一个工具和利器,也是日常我们分析解决问题的必备.准备近期写2篇精华文章,集中给大家分享一下如果通过Windbg进行.NET高级调试. 今天我们来一篇入门的 ...

  5. 玩好.NET高级调试,你也要会写点汇编

    一:背景 1. 简介 .NET 高级调试要想玩的好,看懂汇编是基本功,但看懂汇编和能写点汇编又完全是两回事,所以有时候看的多,总手痒痒想写一点,在 Windows 平台上搭建汇编环境不是那么容易,大多 ...

  6. [Android Studio 权威教程]断点调试和高级调试

    好了开始写一个简单的调试程序,我们先来一个for循环 ? 1 2 3 4 5 6 7 8 <code class="language-java hljs ">for ( ...

  7. android 中如何分析内存泄漏

    转载:http://blog.csdn.net/fulinwsuafcie/article/details/8363218 前提条件: 1,电脑安装了java 运行环境 2,手机端开启了 USB 调试 ...

  8. 理论与实践中的 C# 内存模型,第 2 部分

    转载自:https://msdn.microsoft.com/zh-cn/magazine/jj883956.aspx 这是介绍 C# 内存模型的系列文章的第二篇(共两篇). 正如在 MSDN 杂志十 ...

  9. php中对共享内存,消息队列的操作

    http://www.cnblogs.com/fengwei/archive/2012/09/12/2682646.html php作为脚本程序,通常生命周期都很短,如在web应用中,一次请求就是ph ...

  10. ###Android 断点调试和高级调试###

    转自:http://www.2cto.com/kf/201506/408358.html 有人说Android 的调试是最坑的,那我只能说是你不会用而已,我可以说Android Studio的调试是我 ...

随机推荐

  1. R2在全渠道业务线的落地

    随着业务的增长,系统的高频率迭代,质量保障工作迫切需要引入更加科学高效的测试方法来助力业务高质量的交付.长城项目一期测试中,全渠道质量团队引入技术平台部R2技术,极大的提升了项目交付的质量.因此,本文 ...

  2. Windows平台的JDK安装及IDEA配置JDK的过程

    1.下载安装包 jdk-8u201-windows-x64.exe,即jdk1.8.0_201 链接:https://pan.baidu.com/s/1WYaTlProtHkC_KyMHIUBxQ?p ...

  3. 基于Word2Vec的诗词生成器

    基于Word2Vec制作的诗词生成器 1.什么是Word2Vec? Word2vec 是 Word Embedding 方式之一,属于 NLP 领域.它是从大量文本预料中以无监督方式学习语义知识的模型 ...

  4. 个人GAN训练的性能迭代

    使用GAN进行生成图片 损失函数的迭代 DCGAN->Wasserstein GAN-> Wasserstein GAN + Gradient Penalty Discriminator训 ...

  5. LeetCode 周赛上分之旅 #42 当 LeetCode 考树上倍增,出题的趋势在变化吗

    ️ 本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 和 BaguTree Pro 知识星球提问. 学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越 ...

  6. shopee商品详情接口的应用

    Shopee是东南亚和台湾地区最大的电子商务平台之一,成立于2015年,目前覆盖6个国家和地区.作为一家新兴电商平台,Shopee拥有快速增长的销售额和庞大的用户群体,为开发者提供了丰富的商业机会.其 ...

  7. Leetcode刷题笔记——二分法

    二分法是搜索算法中极其典型的方法,其要求输入序列有序并可随机访问.算法思想为 输入:有序数组nums,目的数值target 要求输出:如果target存在在数组中,则输出其index,否则输出-1 将 ...

  8. 小知识:Docker环境缺少vi命令,如何解决

    docker exec可以使用--user参数指定root用户,进入安装vi即可: [opc@oci-001 ~]$ docker exec -it --user root testdb bash b ...

  9. Wood,微型 Java ORM 框架(首次发版)

    Wood,微型 Java ORM 框架(支持:java sql,xml sql,annotation sql:事务:缓存:监控:等...),零依赖! 特点和理念: 跨平台:可以嵌入到JVM脚本引擎(j ...

  10. 斜率优化DP 学习笔记

    斜率优化 DP 适用情况 适用于求解最优解(最大.最小)问题. 上凸壳与下凸壳 求解步骤 对于任意状态转义方程,设 \(A_i\),\(B_i\),使状态转移方程转化为 \(f_i = \min(f_ ...