! dumpheap vs! strings - different number of records and different length of strings

Note:

0:000> !dumpheap -min 0n100000 -mt 00007fff6c9c16b8 -live
         Address               MT     Size
0000009757e51038 00007fff6c9c16b8   116590     
0000009757e6d7c8 00007fff6c9c16b8   121392     
0000009757e8b218 00007fff6c9c16b8   160838     
0000009757eb2680 00007fff6c9c16b8   160826     
0000009757ed9ae0 00007fff6c9c16b8   179332     
0000009767e51038 00007fff6c9c16b8   121516     
0000009767e6eb08 00007fff6c9c16b8   129002     
0000009767e8e318 00007fff6c9c16b8   154506     
0000009767eb3ec8 00007fff6c9c16b8   153568     
0000009767ed96c8 00007fff6c9c16b8   212294     
0000009767f223e0 00007fff6c9c16b8   211356     
0000009767f55da0 00007fff6c9c16b8   157274     
0000009767f7c420 00007fff6c9c16b8   156336     
0000009767fa26f0 00007fff6c9c16b8   215062     
0000009767fd6f28 00007fff6c9c16b8   214124     
0000009777e71070 00007fff6c9c16b8   130594     

Statistics:
              MT    Count    TotalSize Class Name
00007fff6c9c16b8       16      2594610 System.String
Total 16 objects
0:000> !strings /n:100000
Address            Gen    Length   Value
---------------------------------------
0000009767ed96c8   LOH    106134   
                SET DEADLOCK_PRIORITY HIGH

                DECLARE @CommittedCommitStateId INT = (Select PR...
0000009767f223e0   LOH    105665   
                SET DEADLOCK_PRIORITY HIGH

                DECLARE @CommittedCommitStateId INT = (Select PR...
0000009767fa26f0   LOH    107518   
                SET DEADLOCK_PRIORITY HIGH

                DECLARE @CommittedCommitStateId INT = (Select PR...
0000009767fd6f28   LOH    107049   
                SET DEADLOCK_PRIORITY HIGH

                DECLARE @CommittedCommitStateId INT = (Select PR...
---------------------------------------
4 matching strings

      

Note that !dumpheap

it reports 16 lines in real time, while !strings

it only reports 4.

And their length is different.

Why?

+3


source to share


1 answer


I think I found the answer.

The 4 lines found both !strings

and dumpheap

are of different length, depending on which command is used:

Address            Length by !dumpheap   Length by !strings         
0000009767ed96c8   212294                106134   
0000009767f223e0   211356                105665
0000009767fa26f0   215062                107518
0000009767fd6f28   214124                107049

      



Where:

212294 = 106134 * 2 + 26
211356 = 105665 * 2 + 26
215062 = 107518 * 2 + 26
214124 = 107049 * 2 + 26

      

So here is my hypothesis - !dumpheap

reports the raw size of .NET strings - which means it doubles the number of characters and adds any additional fields to the string object. The commands !strings

simply return the number of characters in the lines.

+2


source







All Articles