原文地址:http://blogs.msdn.com/b/tess/archive/2008/02/15/net-debugging-demos-lab-3-memory.aspx

操作步骤:

1、产生压力:tinyget -srv:localhost -uri:/BuggyBits/Links.aspx -loop:4000

2、观察taskmgr的输出,w3wp的内存每秒钟大概增长100M。

3、内存到700M左右的时候,抓一个hang dump

4、由于这是一个memory的问题,所以我们要先看GC Heap的情况,运行命令:!eeheap -gc,结果如下:

  GC Heap Size  0x2b307720(724596512)

  由于dump一共870M,而GC占用了720M左右,所以我们的重点在于托管内存的分析。

5、看heap的整体状况,运行!dumpheap -stat,结果如下:

  790fd8c4    49787    721599752 System.String

  嗯,720M的托管内存中,String占用了绝大多数。

6、看一下string的情况,根据2/8原则,大小相同的string也许会很多,这里我们过滤一下,看看10K以上大小的字符串,运行命令:!dumpheap -mt 790fd8c4  -min 10000

  0331d6dc 790fd8c4    20020    
  03322534 790fd8c4    20020    
  0332738c 790fd8c4    20020    
  0332c1e4 790fd8c4    20020    
  0333103c 790fd8c4    20020

  大部分都是20K的字符串,随便找一个,我们需要看它被谁分配的

7、运行!gcroot 0331d6dc,结果如下:

  Scan Thread 16 OSTHread 318
  Scan Thread 18 OSTHread c38
  Scan Thread 19 OSTHread a40
  Scan Thread 20 OSTHread c00
  Scan Thread 24 OSTHread 998
  Scan Thread 14 OSTHread 4cc
  Finalizer queue:Root:0331d6b8(Link)->
  0331d6c8(System.Text.StringBuilder)->
  0331d6dc(System.String)

  在14号线程中,Link引用了这个字符串。而且我们看到,link是在Finalizer Queue中的。

8、查看finalizequeue,输出如下:

  057e0bcc    35998       575968 Link

  一共35998个Link对象。由于该对象存在于Finalizequeue中,所以一定显示的实现了Finalize方法。

9、查看该方法,代码如下:

  ~Link()
  {
        //some long running operation when cleaning up the data
        Thread.Sleep(5000);
  }

10、换个方向,看上面步骤7中的那个Link对象,!do 0331d6b8,输出结果如下:

  MT    Field   Offset                 Type VT     Attr    Value Name
  790fdc5c  4000006        4 ...ext.StringBuilder  0 instance 0331d6c8 url
  790fd8c4  4000007        8        System.String  0 instance 029bb0b8 name
  再看第一个url对象,运行!do 0331d6c8 ,结果如下:

        MT    Field   Offset                 Type VT     Attr    Value Name
  791016bc  40000b1        8        System.IntPtr  1 instance    dc1d8 m_currentThread
  79102290  40000b2        c         System.Int32  1 instance 2147483647 m_MaxCapacity
  790fd8c4  40000b3        4        System.String  0 instance 0331d6dc m_StringValue

  注意最后一行的那个m_StringValue,对比一下步骤7中的!gcroot输入。

  从这里我们看到,Link中包含了一个StringBuilder,而StringBuilder中包含了一个20K的字符串。

11、看代码:

  public Link(string name, string url)
      {
          this.name = name;
          this.url.Append(url);
      }
  可以看到,Link对象的构造方法中,引用了字符串。

12、再回头看上面的步骤9,Link自作聪明的实现了Finalize方法,但是该方法执行的时间太长(这里是5秒钟),导致垃圾回收的时候,迟迟不能把该对象回收掉。因为Link引用了字符串url,所以相应的字符串也无法被回收。这样内存就上涨的很快了。

Over

和我一起作Tess的windbg lab - Lab3, Memory相关推荐

  1. MIT 6.828 (二) Lab 2: Memory management

    Lab 2: Memory management 做这个实验之前首先需要知道什么是分页.分段在这个实验里面没用到过. 前面是一大堆教你怎么获取lab2资源的,我不知道怎么弄,后来乱搞了一下,就把lab ...

  2. 2022-3-16 MIT 6.828 Lab 2: Memory Management | Part 3: Kernel Address Space | Exercise 5

    Exercise 5. Fill in the missing code in mem_init() after the call to check_page(). Your code should ...

  3. 2022-3-4 Lab 2: Memory Management | Part 1: Physical Page Management

    一.寻址方式的变化 实模式:CS*4 + ip = 物理地址 保护模式 :以 Segmentation Mechanism 的方式来寻址,addr = selector+ ip 之后在保护模式寻址的基 ...

  4. 从App Lab就一鸣惊人的Gorilla Tag,创始人竟是个电竞选手

    前不久,热门VR游戏<Gorilla Tag>登陆Quest正式商店,此前该作已经进入App Lab和SteamVR平台,一度成为App Lab最受欢迎的游戏,至此终于修成正果.截至目前, ...

  5. 使用WinDbg Preview解决Win10系统蓝屏问题

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/tjhyx2012/article/de ...

  6. 资源向导之 JOS 计划 MIT 6.828

    Project of JOS update: 2016.03.18 哇,JOS过去一段时间了,有一些同学可能获得JOS实验初始的源代码比较困难,原因可能是GFW也可能是JOS官方他们每学期都可能会课程 ...

  7. 使用Heroku,解决gitment登录失败,报[object ProgressEvent]的错

    前情提要 本文详细记录了使用Heroku,解决gitment登录失败,报[object ProgressEvent]的问题.某种程度上借助了网友的思路和方法,并使用了免费的强大的Heroku.某些步骤 ...

  8. 我只是一只碌碌无为的工蚁 : (

    有谁还记得AppleII吗?还记得com机吗?还记得最初黑黝黝的dos吗? 转眼间我已经步入了三十岁,一下子感觉到了生活的沉甸,每至年初岁末,我总喜欢多愁善感,喜欢回顾这一年来的所得所失,今年尤其如此 ...

  9. k8s glusterfs mysql_k8s使用glusterfs实现动态持久化存储

    简介 本文章介绍如何使用glusterfs为k8s提供动态申请pv的功能.glusterfs提供底层存储功能,heketi为glusterfs提供restful风格的api,方便管理glusterfs ...

最新文章

  1. mysql两个表条件_mysql – 在另一个表中选择具有多个条件的...
  2. for java_Java For循环
  3. C语言学习之有一个3X4的二维数组,要求用指向元素的指针变量输出二维数组各元素的值
  4. 悲观锁和乐观锁的区别和应用场景
  5. 去西藏旅游一次要花多少钱,还有8/9月份去那边适合嘛?
  6. Mac google浏览器可以百度 无法登录账号的解决方案
  7. Linux 内核编程总结
  8. 电脑版微信打开内置浏览器
  9. Pubwin经典问题解答100例
  10. 计算机网络中的ping什么意思,PING命令是什么?PING使用方法和参数详解
  11. [生存志] 第21节 历代大事件概览 唐朝
  12. Iphone开发(7) 太你妈辛苦了
  13. Task运行过程分析1
  14. 南柯33的Python学习笔记第(一)部分
  15. 印度萌新令人绝望的操作:提交PR“轰炸”近40万开发者,GitHub负责?
  16. 网站自动翻译-网站批量自动翻译-网站免费翻译导出
  17. STM32—OLED显示屏
  18. 计算机安全与防病毒知识,计算机安全与防病毒知识
  19. win7无法显示隐藏文件 无法找到脚本文件hidefile.vbs
  20. 怎样用好LinkedIn领英平台开发客户?

热门文章

  1. php控制器面向对象编程,php面向对象编程
  2. pythonloop循环结构_python - tensorflow,tf.while_loop:这两个结构没有相同的嵌套结构 - SO中文参考 - www.soinside.com...
  3. 5 java中的集合类_java基础(5)-集合类1
  4. 连接linux软件发复制文件过去,linux基本文件操作
  5. louvian算法 缺点 优化_机器学习中的优化算法(1)-优化算法重要性,SGD,Momentum(附Python示例)...
  6. Linux下scp无密码上传 下载 文件 目录的方法
  7. 数据结构之单链表(golang版)
  8. Django学习笔记(10)——Book单表的增删改查页面
  9. 常用数据库语句(更新)
  10. web-5. 超链接的使用