经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » ASP.net » 查看文章
Net 高级调试之十一:托管堆布局架构和对象分配机制
来源:cnblogs  作者:可均可可  时间:2023/12/1 14:59:29  对本文有异议
一、简介
    今天是《Net 高级调试》的第十一篇文章,这篇文章来的有点晚,因为,最近比较忙,就没时间写文章了。现在终于有点时间,继续开始我们这个系列。这篇文章我们主要介绍托管堆的架构,对象的分配机制,我们如何查找在托管堆上的对象,我学完这章,很多以前很模糊的概念,现在很清晰了,知道了对象代的分配,大对象堆和小对象堆的结构,了解了对象的生命周期,这些是 Net 框架的底层,了解更深,对于我们调试更有利。当然了,第一次看视频或者看书,是很迷糊的,不知道如何操作,还是那句老话,一遍不行,那就再来一遍,还不行,那就再来一遍,俗话说的好,书读千遍,其意自现。
     如果在没有说明的情况下,所有代码的测试环境都是 Net Framewok 4.8,但是,有时候为了查看源码,可能需要使用 Net Core 的项目,我会在项目章节里进行说明。好了,废话不多说,开始我们今天的调试工作。

       调试环境我需要进行说明,以防大家不清楚,具体情况我已经罗列出来。
          操作系统:Windows Professional 10
          调试工具:Windbg Preview(可以去Microsoft Store 去下载)
          开发工具:Visual Studio 2022
          Net 版本:Net Framework 4.8
          CoreCLR源码:源码下载

二、基础知识
    
    1、托管堆和垃圾回收
        1、Windows 内存架构
            要了解 C# 的内存分配机制,首先需要了解 Windows 内存分配的机制,毕竟 CLR 中的内存是从 Windows 上分配过来的。架构图如下:
            

    2、CLR堆管理器

        2.1、简介
            CLR 堆管理器托管的内存划分成两大块。
            a、按对象大小划分
                所有小于 85000 byte 的对象都存放在【小对象堆(SOH)】,大于等于 85000 byte 的对象存放在【大对象堆(BOH)】。

            b、按生存期划分。
                CLR 假设一个新分配的对象往往更容易成为一个垃圾对象,所以回收这些对象的效率会更高,所以在【小对象堆(SOH)】做了一个【代机制】的划分,也就是 0代、1代、2代。            

        2.2、托管堆布局图
            托管堆是由很多的段(segment)组成的,新生成的 segment 叫做临时段,其他的叫 segment 年长段。小对象堆有临时段的概念,大对象堆是没有的。结构如图:
            
            托管堆是由段组成的,在小对象堆中,最新创建的是临时段,其他则是内存段,依次类推。所有的0代对象和1代对象都会分配在临时段上,2代对象会有一部分放在临时段上,其他的段,比如:内存段,永远存放的是2代对象。

        2.3、工作站和服务器GC
            CLR 有两种 GC 模式,分别是:工作站 GC 和 服务器GC。
            a)、工作站GC
                工作站GC 一般指具有窗口类的应用程序,比如:WinForm,WPF,SliverLight,Console,这样的程序只有一个托管堆。
                效果如图:
                  
            b)、服务器GC
                对于 Web 类的程序,一般默认使用 服务器GC,它的托管堆个数和当前机器 CPU 的核数一致。
                如图:
                

    3、对象分配
        当我们在对象堆中分配一个对象时,大致流程如下:
          a)、将一个对象分配到托管堆上。
          b)、如果托管堆的空间不足,将会触发 GC。
          c)、GC 触发之后,如果空间足够的话,就会存放对象。
          d)、如果垃圾对象带有析构函数,那么将会进入到【可终结队列】中被执行。

          过程如图:
          

    4、dumpheap 命令介绍
        为了能够高效的筛选托管堆中的对象,SOS 提供了一个【!dumpheap】命令,这个命令十分强大,可以帮助我们很方便的筛选。 

三、调试过程
    废话不多说,这一节是具体的调试过程,又可以说是眼见为实的过程,在开始之前,我还是要啰嗦两句,这一节分为两个部分,第一部分是测试的源码部分,没有代码,当然就谈不上测试了,调试必须有载体。第二部分就是根据具体的代码来证实我们学到的知识,是具体的眼见为实。

    1、调试源码
        1.1、Example_11_1_1
  1. 1 namespace Example_11_1_1
  2. 2 {
  3. 3 internal class Program
  4. 4 {
  5. 5 static void Main(string[] args)
  6. 6 {
  7. 7 byte[] byte1 = new byte[10000];
  8. 8 byte[] byet2 = new byte[85000];
  9. 9 Console.WriteLine("Hello world!");
  10. 10 Console.ReadLine();
  11. 11 }
  12. 12 }
  13. 13 }
View Code

        1.2、Example_11_1_2
            这个项目很简单,就是建立一个 Asp.Net WebAPI 的项目,不需要写任何代码,使用默认功能就可以。

        1.3、Example_11_1_3
  1. 1 namespace Example_11_1_3
  2. 2 {
  3. 3 internal class Program
  4. 4 {
  5. 5 static void Main(string[] args)
  6. 6 {
  7. 7 byte[] byte1 = new byte[85000];
  8. 8 byte[] byte2 = new byte[1500];
  9. 9 byte[] byet3 = new byte[3500];
  10. 10 Console.WriteLine("3 个 byte[] 分配完毕!");
  11. 11 Console.ReadLine();
  12. 12 }
  13. 13 }
  14. 14 }
View Code

    2、眼见为实
        项目的所有操作都是一样的,所以就在这里说明一下,但是每个测试例子,都需要重新启动,并加载相应的应用程序,加载方法都是一样的。流程如下:我们编译项目,打开 Windbg,点击【文件】----》【launch executable】附加程序,打开调试器的界面,程序已经处于中断状态。

        2.1、我们查看 NT 堆和 GC 堆。
            调试源码:Example_11_1_1
            1)、我们先来查看一下 NT 堆。
            当我们成功进入调试器界面,使用【g】命令,继续运行,我们会在12行代码【Console.ReadLine()】暂停,我们程序打印出了【Hello world】,我们点击调试器工具栏中的【break】按钮,就可以调试程序了。
            我们使用【!address -summary 】命令,查看一下具体情况。
  1. 1 0:006> !address -summary
  2. 2
  3. 3
  4. 4 Mapping file section regions...
  5. 5 Mapping module regions...
  6. 6 Mapping PEB regions...
  7. 7 Mapping TEB and stack regions...
  8. 8 Mapping heap regions...
  9. 9 Mapping page heap regions...
  10. 10 Mapping other regions...
  11. 11 Mapping stack trace database regions...
  12. 12 Mapping activation context regions...
  13. 13
  14. 14 --- Usage Summary ---------------- RgnCount ----------- Total Size -------- %ofBusy %ofTotal
  15. 15 Free 57 f852b000 ( 3.880 GB) 97.00%
  16. 16 Image 191 2eb9000 ( 46.723 MB) 38.06% 1.14%
  17. 17 <unknown> 88 2670000 ( 38.438 MB) 31.31% 0.94%
  18. 18 MappedFile 18 1cec000 ( 28.922 MB) 23.56% 0.71%
  19. 19 Stack 21 700000 ( 7.000 MB) 5.70% 0.17%
  20. 20 Heap 10 13b000 ( 1.230 MB) 1.00% 0.03%
  21. 21 Other 7 5c000 ( 368.000 kB) 0.29% 0.01%
  22. 22 TEB 7 16000 ( 88.000 kB) 0.07% 0.00%
  23. 23 PEB 1 3000 ( 12.000 kB) 0.01% 0.00%
  24. 24
  25. 25 --- Type Summary (for busy) ------ RgnCount ----------- Total Size -------- %ofBusy %ofTotal
  26. 26 MEM_IMAGE 198 2ec3000 ( 46.762 MB) 38.09% 1.14%
  27. 27 MEM_PRIVATE 122 2ebc000 ( 46.734 MB) 38.07% 1.14%
  28. 28 MEM_MAPPED 23 1d46000 ( 29.273 MB) 23.84% 0.71%
  29. 29
  30. 30 --- State Summary ---------------- RgnCount ----------- Total Size -------- %ofBusy %ofTotal
  31. 31 MEM_FREE 57 f852b000 ( 3.880 GB) 97.00%
  32. 32 MEM_RESERVE 65 43a4000 ( 67.641 MB) 55.10% 1.65%
  33. 33 MEM_COMMIT 278 3721000 ( 55.129 MB) 44.90% 1.35%
  34. 34
  35. 35 --- Protect Summary (for commit) - RgnCount ----------- Total Size -------- %ofBusy %ofTotal
  36. 36 PAGE_EXECUTE_READ 32 25b2000 ( 37.695 MB) 30.70% 0.92%
  37. 37 PAGE_READONLY 90 bae000 ( 11.680 MB) 9.51% 0.29%
  38. 38 PAGE_WRITECOPY 30 399000 ( 3.598 MB) 2.93% 0.09%
  39. 39 PAGE_READWRITE 102 1f8000 ( 1.969 MB) 1.60% 0.05%
  40. 40 PAGE_READWRITE | PAGE_GUARD 16 28000 ( 160.000 kB) 0.13% 0.00%
  41. 41 PAGE_EXECUTE_READWRITE 8 8000 ( 32.000 kB) 0.03% 0.00%
  42. 42
  43. 43 --- Largest Region by Usage ----------- Base Address -------- Region Size ----------
  44. 44 Free 80010000 7f2f0000 ( 1.987 GB)
  45. 45 Image 6de80000 f55000 ( 15.332 MB)
  46. 46 <unknown> 2f22000 fee000 ( 15.930 MB)
  47. 47 MappedFile 19d4000 133d000 ( 19.238 MB)
  48. 48 Stack 1410000 fd000 (1012.000 kB)
  49. 49 Heap f20000 8b000 ( 556.000 kB)
  50. 50 Other ff480000 33000 ( 204.000 kB)
  51. 51 TEB ce1000 4000 ( 16.000 kB)
  52. 52 PEB ccc000 3000 ( 12.000 kB)
View Code

            输出的内容还是不少的,列表中【Heap 10 13b000 ( 1.230 MB) 1.00% 0.03%】,这个就是 NT 堆。
            我们也可以使用【!heap -s】命令,查看 NT 堆的详情。

  1. 1 0:006> !heap -s
  2. 2
  3. 3
  4. 4 ************************************************************************************************************************
  5. 5 NT HEAP STATS BELOW
  6. 6 ************************************************************************************************************************
  7. 7 NtGlobalFlag enables following debugging aids for new heaps:
  8. 8 tail checking
  9. 9 free checking
  10. 10 validate parameters
  11. 11 LFH Key : 0x0afd8ea9
  12. 12 Termination on corruption : ENABLED
  13. 13 Heap Flags Reserv Commit Virt Free List UCR Virt Lock Fast
  14. 14 (k) (k) (k) (k) length blocks cont. heap
  15. 15 -----------------------------------------------------------------------------
  16. 16 00f20000 40000062 1020 556 1020 6 65 1 0 4 (第一个堆是进程堆,是 Win32函数用的)
  17. 17 01200000 40001062 60 12 60 1 2 1 0 0
  18. 18 01570000 40001062 60 12 60 1 2 1 0 0
  19. 19 02f00000 40001062 60 4 60 0 1 1 0 0
  20. 20 01540000 40041062 60 4 60 2 1 1 0 0
  21. 21 -----------------------------------------------------------------------------

            2)、我们查看一下 GC 堆。
            如果我们想查看 GC 堆,可以直接使用【!eeheap -gc】命令。

  1. 1 0:006> !eeheap -gc
  2. 2 Number of GC Heaps: 1
  3. 3 generation 0 starts at 0x02f11018
  4. 4 generation 1 starts at 0x02f1100c
  5. 5 generation 2 starts at 0x02f11000
  6. 6 ephemeral segment allocation context: none
  7. 7 segment begin allocated size
  8. 8 02f10000 02f11000 02f1871c 0x771c(30492)
  9. 9 Large object heap starts at 0x03f11000
  10. 10 segment begin allocated size
  11. 11 03f10000 03f11000 03f2a180 0x19180(102784)
  12. 12 Total Size: Size: 0x2089c (133276) bytes.
  13. 13 ------------------------------
  14. 14 GC Heap Size: Size: 0x2089c (133276) bytes.

        2.2、我们查看大对象和小对象分配机制
            调试源码:Example_11_1_1
            当我们成功进入调试器界面,使用【g】命令,继续运行,我们会在12行代码【Console.ReadLine()】暂停,我们程序打印出了【Hello world】,我们点击调试器工具栏中的【break】按钮,就可以调试程序了。
            byte[] byte1 = new byte[10000];这行数组小于85000就应该在小对象堆中,byte[] byet2 = new byte[85000];这个数组对象大于85000 就会分配在大对象堆中。
            我们先使用【!eeheap -gc】查看一下托管堆的情况。
  1. 1 0:006> !eeheap -gc
  2. 2 Number of GC Heaps: 1
  3. 3 generation 0 starts at 0x02f11018
  4. 4 generation 1 starts at 0x02f1100c
  5. 5 generation 2 starts at 0x02f11000
  6. 6 ephemeral segment allocation context: none
  7. 7 segment begin allocated size
  8. 8 02f10000 02f11000 02f1871c 0x771c(30492)
  9. 9 Large object heap starts at 0x03f11000(这个就是大对象堆)
  10. 10 segment begin allocated size
  11. 11 03f10000 03f11000 03f2a180 0x19180(102784)
  12. 12 Total Size: Size: 0x2089c (133276) bytes.
  13. 13 ------------------------------
  14. 14 GC Heap Size: Size: 0x2089c (133276) bytes.

            我们再使用【!dumpheap 03f11000 03f2a180】查看一下大对象堆的情况。

  1. 0:006> !dumpheap 03f11000 03f2a180
  2. Address MT Size
  3. 03f11000 00f45368 10 Free
  4. 03f11010 00f45368 14 Free
  5. 03f11020 6dae2788 4872
  6. 03f12328 00f45368 14 Free
  7. 03f12338 6dae2788 524
  8. 03f12548 00f45368 14 Free
  9. 03f12558 6dae2788 4092
  10. 03f13558 00f45368 14 Free
  11. 03f13568 6dae2788 8172
  12. 03f15558 00f45368 14 Free
  13. 03f15568 6dae5c40 85012
  14. Statistics:
  15. MT Count TotalSize Class Name
  16. 00f45368 6 80 Free
  17. 6dae2788 4 17660 System.Object[]
  18. 6dae5c40 1 85012 System.Byte[]
  19. Total 11 objects

            红色标注的就是我们的 byte 数组,大小是 85012,为什么多了12,数组是引用类型,引用类型都有两个附加字段(8)和一个数组长度(4)的字段,共12,再加上数组的长度就是85012。
            我们确认了 byet2 确实是在大对象堆中,我们继续看看 byet1是不是在小对象堆中。使用相同的命令【!dumpheap 02f11000 02f1871c】,这个地址就是小对象堆的起始地址和结束地址,就是【ephemeral segment allocation】临时段。

  1. 1 0:006> !dumpheap 02f11000 02f1871c
  2. 2 Address MT Size
  3. 3 02f11000 00f45368 10 Free
  4. 4 02f1100c 00f45368 10 Free
  5. 5 .....
  6. 6 02f124fc 00f45368 10 Free
  7. 7 02f12508 6dae5c40 10012
  8. 8 02f14c24 6dae8b20 28
  9. 9 .....
  10. 10 02f174f4 6db49b0c 16
  11. 11
  12. 12 Statistics:
  13. 13 MT Count TotalSize Class Name
  14. 14 ......
  15. 15 6dae5c40 4 10818 System.Byte[]
  16. 16 Total 325 objects

            红色标记的就是 byte 数组,我们使用【!DumpHeap /d -mt 6dae5c40】查看详情。

  1. 1 0:006> !DumpHeap /d -mt 6dae5c40
  2. 2 Address MT Size
  3. 3 02f12508 6dae5c40 10012
  4. 4 02f16710 6dae5c40 526
  5. 5 02f171cc 6dae5c40 268
  6. 6 02f174e8 6dae5c40 12
  7. 7 03f15568 6dae5c40 85012
  8. 8
  9. 9 Statistics:
  10. 10 MT Count TotalSize Class Name
  11. 11 6dae5c40 5 95830 System.Byte[]
  12. 12 Total 5 objects

            红色标记的就是我们的 byte1 byte 数组。当然,我们可以使用命令【!do】查看详情。

  1. 1 0:006> !do 02f12508
  2. 2 Name: System.Byte[]
  3. 3 MethodTable: 6dae5c40
  4. 4 EEClass: 6dbe8ba8
  5. 5 Size: 10012(0x271c) bytes
  6. 6 Array: Rank 1, Number of elements 10000, Type Byte (Print Array)
  7. 7 Content: ................................................................................................................................
  8. 8 Fields:
  9. 9 None

        2.3、如何按生存期查看对象的分配。
            调试源码:Example_11_1_1
            当我们成功进入调试器界面,使用【g】命令,继续运行,我们会在12行代码【Console.ReadLine()】暂停,我们程序打印出了【Hello world】,我们点击调试器工具栏中的【break】按钮,就可以调试程序了。
            其实,有关对象代的调试,我们已经做过了,这里正式测试一下,我们依然使用【!eeheap -gc】命令,就可以看到托管堆中的代了。
  1. 1 0:006> !eeheap -gc
  2. 2 Number of GC Heaps: 1
  3. 3 generation 0 starts at 0x02f110180代)
  4. 4 generation 1 starts at 0x02f1100c1代)
  5. 5 generation 2 starts at 0x02f110002代)
  6. 6 ephemeral segment allocation context: none
  7. 7 segment begin allocated size
  8. 8 02f10000 02f11000 02f1871c 0x771c(30492)
  9. 9 Large object heap starts at 0x03f11000
  10. 10 segment begin allocated size
  11. 11 03f10000 03f11000 03f2a180 0x19180(102784)
  12. 12 Total Size: Size: 0x2089c (133276) bytes.
  13. 13 ------------------------------
  14. 14 GC Heap Size: Size: 0x2089c (133276) bytes.

        2.4、查看 Console GC 模式
            调试源码:Example_11_1_1
            当我们成功进入调试器界面,使用【g】命令,继续运行,我们会在12行代码【Console.ReadLine()】暂停,我们程序打印出了【Hello world】,我们点击调试器工具栏中的【break】按钮,就可以调试程序了。
            我们可以使用【!eeversion】命令,查看GC模式。
  1. 1 0:006> !eeversion
  2. 2 4.8.4300.0 retail
  3. 3 Workstation mode(工作站模式)
  4. 4 SOS Version: 4.8.4300.0 retail build

            我们也可以通过【!eeheap -gc】命令查看托管堆的个数查看。

  1. 1 0:006> !eeheap -gc
  2. 2 Number of GC Heaps: 1(只有一个托管堆,就是工作站模式)
  3. 3 generation 0 starts at 0x02f11018
  4. 4 generation 1 starts at 0x02f1100c
  5. 5 generation 2 starts at 0x02f11000
  6. 6 ephemeral segment allocation context: none
  7. 7 segment begin allocated size
  8. 8 02f10000 02f11000 02f1871c 0x771c(30492)
  9. 9 Large object heap starts at 0x03f11000
  10. 10 segment begin allocated size
  11. 11 03f10000 03f11000 03f2a180 0x19180(102784)
  12. 12 Total Size: Size: 0x2089c (133276) bytes.
  13. 13 ------------------------------
  14. 14 GC Heap Size: Size: 0x2089c (133276) bytes.
            
        2.5、查看 Asp.Net Web API 的 GC 模式
            调试源码:Example_11_1_2
            这里测试的源码时 Web API 项目,直接运行程序,然后我们通过 Windbg 的【attach to Process】命令来查看。附加进程的进程是【iisexpress】,效果如图:
            

            如果你使用的是【Debug】运行的 WEBAPI,调试会失败,附加进程有误,如图:
            
            在 Windbg中提示的具体错误:"The process that you are attempting to attach to is already being debugged. Only one debugger can be invasively attached to a process at a time. A non-invasive attach is still possible when another debugger is attached." ,意思就是:尝试附加到的进程已在调试中。一次只能将一个调试器侵入性附加到进程。把程序的运行模式改为【Release】模式,不用使用调试模式,快捷键:Ctrl+F5,就可以附加进程成功了。
            我们可以使用【!eeheap -gc】命令查看一下服务器GC模式。

  1. 1 0:037> !eeheap -gc
  2. 2 Number of GC Heaps: 4(有四个堆,这既是服务器GC模式)
  3. 3 ------------------------------
  4. 4 Heap 0 (000001ff28a2dc70)
  5. 5 generation 0 starts at 0x000001ff29283e08
  6. 6 generation 1 starts at 0x000001ff29121018
  7. 7 generation 2 starts at 0x000001ff29121000
  8. 8 ephemeral segment allocation context: none
  9. 9 segment begin allocated size
  10. 10 000001ff29120000 000001ff29121000 000001ff2a79a728 0x1679728(23566120)
  11. 11 Large object heap starts at 0x0000020329121000
  12. 12 segment begin allocated size
  13. 13 0000020329120000 0000020329121000 000002032941f2c0 0x2fe2c0(3138240)
  14. 14 Heap Size: Size: 0x19779e8 (26704360) bytes.
  15. 15 ------------------------------
  16. 16 Heap 1 (000001ff28a5dc40)
  17. 17 generation 0 starts at 0x000002002923b6d0
  18. 18 generation 1 starts at 0x0000020029121018
  19. 19 generation 2 starts at 0x0000020029121000
  20. 20 ephemeral segment allocation context: none
  21. 21 segment begin allocated size
  22. 22 0000020029120000 0000020029121000 000002002a755fe8 0x1634fe8(23285736)
  23. 23 Large object heap starts at 0x0000020339121000
  24. 24 segment begin allocated size
  25. 25 0000020339120000 0000020339121000 00000203392c8ff0 0x1a7ff0(1736688)
  26. 26 Heap Size: Size: 0x17dcfd8 (25022424) bytes.
  27. 27 ------------------------------
  28. 28 Heap 2 (000001ff28a87bf0)
  29. 29 generation 0 starts at 0x00000201291ebe00
  30. 30 generation 1 starts at 0x0000020129121018
  31. 31 generation 2 starts at 0x0000020129121000
  32. 32 ephemeral segment allocation context: none
  33. 33 segment begin allocated size
  34. 34 0000020129120000 0000020129121000 000002012993ffe8 0x81efe8(8515560)
  35. 35 Large object heap starts at 0x0000020349121000
  36. 36 segment begin allocated size
  37. 37 0000020349120000 0000020349121000 0000020349121018 0x18(24)
  38. 38 Heap Size: Size: 0x81f000 (8515584) bytes.
  39. 39 ------------------------------
  40. 40 Heap 3 (000001ff28ab1ba0)
  41. 41 generation 0 starts at 0x00000202291ebab8
  42. 42 generation 1 starts at 0x0000020229121018
  43. 43 generation 2 starts at 0x0000020229121000
  44. 44 ephemeral segment allocation context: none
  45. 45 segment begin allocated size
  46. 46 0000020229120000 0000020229121000 000002022a711fe8 0x15f0fe8(23007208)
  47. 47 Large object heap starts at 0x0000020359121000
  48. 48 segment begin allocated size
  49. 49 0000020359120000 0000020359121000 00000203592d9ec8 0x1b8ec8(1806024)
  50. 50 Heap Size: Size: 0x17a9eb0 (24813232) bytes.
  51. 51 ------------------------------
  52. 52 GC Heap Size: Size: 0x511d870 (85055600) bytes.

            当然,我们也可以使用【!eeversion】查看 GC 的模式。

  1. 1 0:037> !eeversion
  2. 2 4.8.4300.0 free
  3. 3 Server mode with 4 gc heaps(服务器模式)
  4. 4 SOS Version: 4.8.4300.0 retail build

            我的机器当前又4个CPU,截图如下:
            

            所以,服务器 GC 模式就有 4个 托管堆。

        2.6、【!dumpheap】命令使用简介
            调试源码:Example_11_1_3
            当我们成功进入调试器界面,使用【g】命令,继续运行,我们会在12行代码【Console.ReadLine()】暂停,我们程序打印出了【3 个 byte[] 分配完毕!】,我们点击调试器工具栏中的【break】按钮,就可以调试程序了,开始我们的筛选调试。
            如果我们直接使用【!dumpheap】命令,列出的内容太多了,想要从中查找一个对象,好像大海捞针一样,所以我们就需要过滤。
            a)、我们过滤对象大小在1000-2000之间的对象。
                我们执行命令【!dumpheap -min 0n1000 -max0n2000】,0n是十进制,默认0x十六进制。
  1. 1 0:006> !dumpheap -min 0n1000 -max 0n2000
  2. 2 Address MT Size
  3. 3 03372514 6da95c40 1512
  4. 4 03375690 6da92c60 1660
  5. 5
  6. 6 Statistics:
  7. 7 MT Count TotalSize Class Name
  8. 8 6da95c40 1 1512 System.Byte[]
  9. 9 6da92c60 1 1660 System.Char[]
  10. 10 Total 2 objects

                我们再来一个错误的演示,把0n去掉,执行如下;

  1. 1 0:006> !dumpheap -min 1000 -max 2000
  2. 2 Address MT Size
  3. 3 04371020 6da92788 4872
  4. 4 04373568 6da92788 8172
  5. 5
  6. 6 Statistics:
  7. 7 MT Count TotalSize Class Name
  8. 8 6da92788 2 13044 System.Object[]
  9. 9 Total 2 objects

                把 0n 去掉,我们看看1000和2000是多少。

  1. 1 0:006> ? 1000
  2. 2 Evaluate expression: 4096 = 00001000
  3. 3 0:006> ? 2000
  4. 4 Evaluate expression: 8192 = 00002000

                看到了把,查找的范围就是4000多到8000多,意思就不对了,所以一定要加上 0n。


            b)、我要找到大于1000的对象,我们可以使用【!dumpheap -min 0n1000】,去掉 -max 就可以了。          
  1. 1 0:006> !dumpheap -min 0n1000
  2. 2 Address MT Size
  3. 3 03372514 6da95c40 1512
  4. 4 03372afc 6da95c40 3512
  5. 5 03375690 6da92c60 1660
  6. 6 04371020 6da92788 4872
  7. 7 04372558 6da92788 4092
  8. 8 04373568 6da92788 8172
  9. 9 04375568 6da95c40 85012
  10. 10
  11. 11 Statistics:
  12. 12 MT Count TotalSize Class Name
  13. 13 6da92c60 1 1660 System.Char[]
  14. 14 6da92788 3 17136 System.Object[]
  15. 15 6da95c40 3 90036 System.Byte[]
  16. 16 Total 7 objects

                都是我们要查找的对象。

            c)、找到托管堆中的所有 System.String 对象,我们可以执行【!dumpheap -type String】命令。
                我们可以使用【!dumpheap -stat】命令,统计一下托管堆对象的结果,我们只关注 String。
  1. 1 0:006> !dumpheap -stat
  2. 2 Statistics:
  3. 3 MT Count TotalSize Class Name
  4. 4 6da95468 1 12 System.Collections.Generic.GenericEqualityComparer`1[[System.String, mscorlib]]
  5. 5 ......
  6. 6 6da924e4 166 5926 System.String
  7. 7 6da92788 6 17748 System.Object[]
  8. 8 6da95c40 6 90842 System.Byte[]
  9. 9 Total 337 objects

                红色标记的我们要查找的字符串。

  1. 1 0:006> !dumpheap -type string
  2. 2 Address MT Size
  3. 3
  4. 4 Statistics:
  5. 5 MT Count TotalSize Class Name
  6. 6 Total 0 objects
  7. 7 0:006> !dumpheap -type String
  8. 8 Address MT Size
  9. 9 03371228 6da924e4 14
  10. 10 03371254 6da924e4 208
  11. 11 03371324 6da924e4 258
  12. 12 03371498 6da924e4 22
  13. 13 033714b0 6da924e4 78
  14. 14 03371544 6da924e4 244
  15. 15 03371638 6da924e4 28
  16. 16 03371664 6da924e4 50
  17. 17 03371698 6da92d74 84
  18. 18 033716ec 6da924e4 208
  19. 19 033717bc 6da924e4 64
  20. 20 033717fc 6da924e4 28
  21. 21 03371818 6da924e4 16
  22. 22 03371828 6da924e4 38
  23. 23 03371850 6da924e4 44
  24. 24 0337187c 6da924e4 46
  25. 25 033718ac 6da924e4 34
  26. 26 033718d0 6da924e4 28
  27. 27 033718ec 6da924e4 30
  28. 28 0337190c 6da924e4 38
  29. 29 03371934 6da924e4 58
  30. 30 03371970 6da924e4 58
  31. 31 033719ac 6da924e4 64
  32. 32 033719ec 6da924e4 52
  33. 33 03371a20 6da924e4 50
  34. 34 03371a54 6da924e4 44
  35. 35 03371a80 6da924e4 44
  36. 36 03371aac 6da924e4 30
  37. 37 03371acc 6da924e4 42
  38. 38 03371af8 6da924e4 56
  39. 39 03371b30 6da924e4 36
  40. 40 03371b54 6da924e4 24
  41. 41 03371b6c 6da924e4 106
  42. 42 03371bd8 6da924e4 148
  43. 43 03371c6c 6da924e4 78
  44. 44 03371cbc 6da924e4 70
  45. 45 03371d04 6da924e4 82
  46. 46 03372494 6da924e4 66
  47. 47 033724d8 6da92d74 12
  48. 48 033724e4 6da924e4 46
  49. 49 033738f0 6da924e4 16
  50. 50 03373a04 6da924e4 40
  51. 51 03373aac 6da924e4 30
  52. 52 03373acc 6da924e4 26
  53. 53 03373b60 6da924e4 78
  54. 54 03373bf8 6da924e4 16
  55. 55 03373c08 6da924e4 16
  56. 56 03373c18 6da924e4 16
  57. 57 03373c28 6da924e4 16
  58. 58 03373c38 6da924e4 90
  59. 59 03373c94 6da924e4 18
  60. 60 03373ca8 6da924e4 50
  61. 61 03373cdc 6da924e4 18
  62. 62 03373cf0 6da924e4 48
  63. 63 03373d20 6da924e4 16
  64. 64 03373d30 6da924e4 16
  65. 65 03373d40 6da924e4 16
  66. 66 03373d50 6da924e4 16
  67. 67 03373d60 6da924e4 16
  68. 68 03373d70 6da924e4 16
  69. 69 03373d80 6da924e4 16
  70. 70 03373d90 6da924e4 16
  71. 71 03373da0 6da924e4 16
  72. 72 03373db0 6da924e4 16
  73. 73 03373dc0 6da924e4 16
  74. 74 03373dd0 6da924e4 20
  75. 75 03373de4 6da924e4 30
  76. 76 03373e04 6da924e4 32
  77. 77 03373e24 6da924e4 16
  78. 78 03373e34 6da924e4 16
  79. 79 03373e44 6da924e4 16
  80. 80 03373e54 6da924e4 20
  81. 81 03373e68 6da924e4 68
  82. 82 03373eac 6da924e4 18
  83. 83 03373ec0 6da924e4 18
  84. 84 03373ed4 6da924e4 30
  85. 85 03373ef4 6da924e4 24
  86. 86 03373f0c 6da924e4 30
  87. 87 03373f2c 6da924e4 22
  88. 88 03373f44 6da924e4 28
  89. 89 03373f60 6da924e4 24
  90. 90 03373f78 6da924e4 20
  91. 91 03373f8c 6da924e4 20
  92. 92 03373fa0 6da924e4 20
  93. 93 03373fb4 6da924e4 20
  94. 94 03373fd4 6da924e4 40
  95. 95 03373ffc 6da924e4 114
  96. 96 033741bc 6da92d74 52
  97. 97 03374210 6da92d74 16
  98. 98 03374220 6da92d74 28
  99. 99 0337423c 6da92d74 16
  100. 100 033742c4 6da924e4 50
  101. 101 033742f8 6da924e4 34
  102. 102 0337431c 6da924e4 34
  103. 103 03374340 6da924e4 50
  104. 104 03374374 6da924e4 32
  105. 105 03374394 6da924e4 28
  106. 106 033743b0 6da924e4 22
  107. 107 033743c8 6da924e4 18
  108. 108 033743dc 6da924e4 26
  109. 109 033743f8 6da924e4 26
  110. 110 03374414 6da924e4 28
  111. 111 03374430 6da924e4 32
  112. 112 03374450 6da924e4 30
  113. 113 03374470 6da924e4 26
  114. 114 0337448c 6da924e4 30
  115. 115 033744ac 6da924e4 20
  116. 116 033744c0 6da924e4 20
  117. 117 033744d4 6da924e4 20
  118. 118 033744e8 6da924e4 20
  119. 119 033744fc 6da924e4 20
  120. 120 03374510 6da924e4 20
  121. 121 03374524 6da924e4 20
  122. 122 03374538 6da924e4 18
  123. 123 0337454c 6da924e4 18
  124. 124 03374560 6da924e4 18
  125. 125 03374574 6da924e4 18
  126. 126 03374588 6da924e4 18
  127. 127 0337459c 6da924e4 18
  128. 128 033745b0 6da924e4 18
  129. 129 033745c4 6da924e4 28
  130. 130 033745e0 6da924e4 30
  131. 131 03374600 6da924e4 24
  132. 132 03374618 6da924e4 24
  133. 133 03374630 6da924e4 20
  134. 134 03374644 6da924e4 22
  135. 135 0337465c 6da924e4 22
  136. 136 03374674 6da924e4 26
  137. 137 03374690 6da924e4 32
  138. 138 033746b0 6da924e4 28
  139. 139 033746cc 6da924e4 30
  140. 140 033746ec 6da924e4 30
  141. 141 0337470c 6da924e4 20
  142. 142 03374720 6da924e4 20
  143. 143 03374734 6da924e4 20
  144. 144 03374748 6da924e4 20
  145. 145 0337475c 6da924e4 20
  146. 146 03374770 6da924e4 20
  147. 147 03374784 6da924e4 20
  148. 148 03374798 6da924e4 20
  149. 149 033747ac 6da924e4 20
  150. 150 033747c0 6da924e4 20
  151. 151 033747d4 6da924e4 20
  152. 152 0337483c 6da92d74 20
  153. 153 03374850 6da92d74 16
  154. 154 03374860 6da92d74 16
  155. 155 03374870 6da92d74 16
  156. 156 03374880 6da92d74 16
  157. 157 03374890 6da92d74 16
  158. 158 033748a0 6da92d74 40
  159. 159 033748c8 6da92d74 40
  160. 160 033748f0 6da92d74 40
  161. 161 03374918 6da92d74 64
  162. 162 03374958 6da92d74 64
  163. 163 03374998 6da924e4 26
  164. 164 033749b4 6da924e4 26
  165. 165 033749d0 6da924e4 24
  166. 166 03374a30 6da9524c 28
  167. 167 03374a64 6da924e4 24
  168. 168 03374a7c 6da952a0 48
  169. 169 03374ae4 6da95468 12
  170. 170 03374c24 6da924e4 24
  171. 171 03374c3c 6da924e4 24
  172. 172 03374c54 6da924e4 24
  173. 173 03374c6c 6da924e4 24
  174. 174 03374c84 6da924e4 24
  175. 175 03374c9c 6da924e4 24
  176. 176 03374cd8 6da955bc 60
  177. 177 03374d14 6da924e4 24
  178. 178 03374d88 6da924e4 26
  179. 179 03374da4 6da924e4 22
  180. 180 03374df4 6da9524c 28
  181. 181 03374fb4 6da92d74 52
  182. 182 03374fe8 6da924e4 16
  183. 183 03374ff8 6da924e4 20
  184. 184 0337500c 6da924e4 16
  185. 185 0337501c 6da924e4 16
  186. 186 0337502c 6da924e4 16
  187. 187 0337503c 6da924e4 16
  188. 188 0337504c 6da924e4 62
  189. 189 0337512c 6da924e4 30
  190. 190 0337514c 6da924e4 26
  191. 191 033755b0 6da924e4 24
  192. 192 033755c8 6da924e4 24
  193. 193 033755e0 6da924e4 32
  194. 194 03375600 6da924e4 32
  195. 195 03375620 6da924e4 32
  196. 196 03375d98 6da924e4 24
  197. 197 03375db0 6da924e4 26
  198. 198
  199. 199 Statistics:
  200. 200 MT Count TotalSize Class Name
  201. 201 6da95468 1 12 System.Collections.Generic.GenericEqualityComparer`1[[System.String, mscorlib]]
  202. 202 6da952a0 1 48 System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[System.Globalization.CultureData, mscorlib]]
  203. 203 6da9524c 2 56 System.Text.StringBuilder
  204. 204 6da955bc 1 60 System.Collections.Generic.Dictionary`2+Entry[[System.String, mscorlib],[System.Globalization.CultureData, mscorlib]][]
  205. 205 6da92d74 18 608 System.String[]
  206. 206 6da924e4 166 5926 System.String
  207. 207 Total 189 objects
View Code

                字符串对象还是挺多的,如果想看效果,可以点开查看。

                当然,如果我们知道字符串的方法表,也可以找到的到,这个样更精确。【!dumpheap -type String】是模糊查找,所有和字符串相关都会找到,我们使用【!dumpheap -mt 6da924e4】,这个才最准确。

  1. 1 0:006> !dumpheap -mt 6da924e4
  2. 2 Address MT Size
  3. 3 03371228 6da924e4 14
  4. 4 03371254 6da924e4 208
  5. 5 03371324 6da924e4 258
  6. 6 03371498 6da924e4 22
  7. 7 033714b0 6da924e4 78
  8. 8 03371544 6da924e4 244
  9. 9 03371638 6da924e4 28
  10. 10 03371664 6da924e4 50
  11. 11 033716ec 6da924e4 208
  12. 12 033717bc 6da924e4 64
  13. 13 033717fc 6da924e4 28
  14. 14 03371818 6da924e4 16
  15. 15 03371828 6da924e4 38
  16. 16 03371850 6da924e4 44
  17. 17 0337187c 6da924e4 46
  18. 18 033718ac 6da924e4 34
  19. 19 033718d0 6da924e4 28
  20. 20 033718ec 6da924e4 30
  21. 21 0337190c 6da924e4 38
  22. 22 03371934 6da924e4 58
  23. 23 03371970 6da924e4 58
  24. 24 033719ac 6da924e4 64
  25. 25 033719ec 6da924e4 52
  26. 26 03371a20 6da924e4 50
  27. 27 03371a54 6da924e4 44
  28. 28 03371a80 6da924e4 44
  29. 29 03371aac 6da924e4 30
  30. 30 03371acc 6da924e4 42
  31. 31 03371af8 6da924e4 56
  32. 32 03371b30 6da924e4 36
  33. 33 03371b54 6da924e4 24
  34. 34 03371b6c 6da924e4 106
  35. 35 03371bd8 6da924e4 148
  36. 36 03371c6c 6da924e4 78
  37. 37 03371cbc 6da924e4 70
  38. 38 03371d04 6da924e4 82
  39. 39 03372494 6da924e4 66
  40. 40 033724e4 6da924e4 46
  41. 41 033738f0 6da924e4 16
  42. 42 03373a04 6da924e4 40
  43. 43 03373aac 6da924e4 30
  44. 44 03373acc 6da924e4 26
  45. 45 03373b60 6da924e4 78
  46. 46 03373bf8 6da924e4 16
  47. 47 03373c08 6da924e4 16
  48. 48 03373c18 6da924e4 16
  49. 49 03373c28 6da924e4 16
  50. 50 03373c38 6da924e4 90
  51. 51 03373c94 6da924e4 18
  52. 52 03373ca8 6da924e4 50
  53. 53 03373cdc 6da924e4 18
  54. 54 03373cf0 6da924e4 48
  55. 55 03373d20 6da924e4 16
  56. 56 03373d30 6da924e4 16
  57. 57 03373d40 6da924e4 16
  58. 58 03373d50 6da924e4 16
  59. 59 03373d60 6da924e4 16
  60. 60 03373d70 6da924e4 16
  61. 61 03373d80 6da924e4 16
  62. 62 03373d90 6da924e4 16
  63. 63 03373da0 6da924e4 16
  64. 64 03373db0 6da924e4 16
  65. 65 03373dc0 6da924e4 16
  66. 66 03373dd0 6da924e4 20
  67. 67 03373de4 6da924e4 30
  68. 68 03373e04 6da924e4 32
  69. 69 03373e24 6da924e4 16
  70. 70 03373e34 6da924e4 16
  71. 71 03373e44 6da924e4 16
  72. 72 03373e54 6da924e4 20
  73. 73 03373e68 6da924e4 68
  74. 74 03373eac 6da924e4 18
  75. 75 03373ec0 6da924e4 18
  76. 76 03373ed4 6da924e4 30
  77. 77 03373ef4 6da924e4 24
  78. 78 03373f0c 6da924e4 30
  79. 79 03373f2c 6da924e4 22
  80. 80 03373f44 6da924e4 28
  81. 81 03373f60 6da924e4 24
  82. 82 03373f78 6da924e4 20
  83. 83 03373f8c 6da924e4 20
  84. 84 03373fa0 6da924e4 20
  85. 85 03373fb4 6da924e4 20
  86. 86 03373fd4 6da924e4 40
  87. 87 03373ffc 6da924e4 114
  88. 88 033742c4 6da924e4 50
  89. 89 033742f8 6da924e4 34
  90. 90 0337431c 6da924e4 34
  91. 91 03374340 6da924e4 50
  92. 92 03374374 6da924e4 32
  93. 93 03374394 6da924e4 28
  94. 94 033743b0 6da924e4 22
  95. 95 033743c8 6da924e4 18
  96. 96 033743dc 6da924e4 26
  97. 97 033743f8 6da924e4 26
  98. 98 03374414 6da924e4 28
  99. 99 03374430 6da924e4 32
  100. 100 03374450 6da924e4 30
  101. 101 03374470 6da924e4 26
  102. 102 0337448c 6da924e4 30
  103. 103 033744ac 6da924e4 20
  104. 104 033744c0 6da924e4 20
  105. 105 033744d4 6da924e4 20
  106. 106 033744e8 6da924e4 20
  107. 107 033744fc 6da924e4 20
  108. 108 03374510 6da924e4 20
  109. 109 03374524 6da924e4 20
  110. 110 03374538 6da924e4 18
  111. 111 0337454c 6da924e4 18
  112. 112 03374560 6da924e4 18
  113. 113 03374574 6da924e4 18
  114. 114 03374588 6da924e4 18
  115. 115 0337459c 6da924e4 18
  116. 116 033745b0 6da924e4 18
  117. 117 033745c4 6da924e4 28
  118. 118 033745e0 6da924e4 30
  119. 119 03374600 6da924e4 24
  120. 120 03374618 6da924e4 24
  121. 121 03374630 6da924e4 20
  122. 122 03374644 6da924e4 22
  123. 123 0337465c 6da924e4 22
  124. 124 03374674 6da924e4 26
  125. 125 03374690 6da924e4 32
  126. 126 033746b0 6da924e4 28
  127. 127 033746cc 6da924e4 30
  128. 128 033746ec 6da924e4 30
  129. 129 0337470c 6da924e4 20
  130. 130 03374720 6da924e4 20
  131. 131 03374734 6da924e4 20
  132. 132 03374748 6da924e4 20
  133. 133 0337475c 6da924e4 20
  134. 134 03374770 6da924e4 20
  135. 135 03374784 6da924e4 20
  136. 136 03374798 6da924e4 20
  137. 137 033747ac 6da924e4 20
  138. 138 033747c0 6da924e4 20
  139. 139 033747d4 6da924e4 20
  140. 140 03374998 6da924e4 26
  141. 141 033749b4 6da924e4 26
  142. 142 033749d0 6da924e4 24
  143. 143 03374a64 6da924e4 24
  144. 144 03374c24 6da924e4 24
  145. 145 03374c3c 6da924e4 24
  146. 146 03374c54 6da924e4 24
  147. 147 03374c6c 6da924e4 24
  148. 148 03374c84 6da924e4 24
  149. 149 03374c9c 6da924e4 24
  150. 150 03374d14 6da924e4 24
  151. 151 03374d88 6da924e4 26
  152. 152 03374da4 6da924e4 22
  153. 153 03374fe8 6da924e4 16
  154. 154 03374ff8 6da924e4 20
  155. 155 0337500c 6da924e4 16
  156. 156 0337501c 6da924e4 16
  157. 157 0337502c 6da924e4 16
  158. 158 0337503c 6da924e4 16
  159. 159 0337504c 6da924e4 62
  160. 160 0337512c 6da924e4 30
  161. 161 0337514c 6da924e4 26
  162. 162 033755b0 6da924e4 24
  163. 163 033755c8 6da924e4 24
  164. 164 033755e0 6da924e4 32
  165. 165 03375600 6da924e4 32
  166. 166 03375620 6da924e4 32
  167. 167 03375d98 6da924e4 24
  168. 168 03375db0 6da924e4 26
  169. 169
  170. 170 Statistics:
  171. 171 MT Count TotalSize Class Name
  172. 172 6da924e4 166 5926 System.String
  173. 173 Total 166 objects
View Code


            d)、我们可以搜索大对象堆或者小对象堆中的对象,我们可以执行【!dumpheap】命令,命令后可以跟 Segment 段的开始和结束地址。
                我们查看小对象堆的对象。

  1. 1 0:006> !eeheap -gc
  2. 2 Number of GC Heaps: 1
  3. 3 generation 0 starts at 0x03371018
  4. 4 generation 1 starts at 0x0337100c
  5. 5 generation 2 starts at 0x03371000
  6. 6 ephemeral segment allocation context: none
  7. 7 segment begin allocated size
  8. 8 03370000 03371000 03377ff4 0x6ff4(28660)
  9. 9 Large object heap starts at 0x04371000
  10. 10 segment begin allocated size
  11. 11 04370000 04371000 0438a180 0x19180(102784)
  12. 12 Total Size: Size: 0x20174 (131444) bytes.
  13. 13 ------------------------------
  14. 14 GC Heap Size: Size: 0x20174 (131444) bytes.
  15. 15
  16. 16
  17. 17 0:006> !dumpheap 03371000 03377ff4
  18. 18 Address MT Size
  19. 19 03371000 015c4e80 10 Free
  20. 20 0337100c 015c4e80 10 Free
  21. 21 03371018 015c4e80 10 Free
  22. 22 。。。。。。。

            我们查看大对象堆的对象。

  1. 1 0:006> !eeheap -gc
  2. 2 Number of GC Heaps: 1
  3. 3 generation 0 starts at 0x03371018
  4. 4 generation 1 starts at 0x0337100c
  5. 5 generation 2 starts at 0x03371000
  6. 6 ephemeral segment allocation context: none
  7. 7 segment begin allocated size
  8. 8 03370000 03371000 03377ff4 0x6ff4(28660)
  9. 9 Large object heap starts at 0x04371000
  10. 10 segment begin allocated size
  11. 11 04370000 04371000 0438a180 0x19180(102784)
  12. 12 Total Size: Size: 0x20174 (131444) bytes.
  13. 13 ------------------------------
  14. 14 GC Heap Size: Size: 0x20174 (131444) bytes.
  15. 15 0:006> !dumpheap 04371000 0438a180
  16. 16 Address MT Size
  17. 17 04371000 015c4e80 10 Free
  18. 18 04371010 015c4e80 14 Free
  19. 19 04371020 6da92788 4872
  20. 20 04372328 015c4e80 14 Free
  21. 21 04372338 6da92788 524
  22. 22 04372548 015c4e80 14 Free
  23. 23 04372558 6da92788 4092
  24. 24 04373558 015c4e80 14 Free
  25. 25 04373568 6da92788 8172
  26. 26 04375558 015c4e80 14 Free
  27. 27 04375568 6da95c40 85012
  28. 28
  29. 29 Statistics:
  30. 30 MT Count TotalSize Class Name
  31. 31 015c4e80 6 80 Free
  32. 32 6da92788 4 17660 System.Object[]
  33. 33 6da95c40 1 85012 System.Byte[]
  34. 34 Total 11 objects

        2.7\

四、总结
    终于写完了,由于这周比较忙,写文章的速度也慢了下来了,没办法,要先把工作做好,工作是本分。还是老话,虽然很忙,写作过程也挺累的,但是看到了自己的成长,心里还是挺快乐的。学习过程真的没那么轻松,还好是自己比较喜欢这一行,否则真不知道自己能不能坚持下来。老话重谈,《高级调试》的这本书第一遍看,真的很晕,第二遍稍微好点,不学不知道,一学吓一跳,自己欠缺的很多。好了,不说了,不忘初心,继续努力,希望老天不要辜负努力的人。

原文链接:https://www.cnblogs.com/PatrickLiu/p/17864600.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号