@@ -141,6 +141,7 @@ func (p *Process) readSpans() {
141
141
allspans := mheap .Field ("allspans" )
142
142
var allSpanSize int64
143
143
var freeSpanSize int64
144
+ var releasedSpanSize int64
144
145
var manualSpanSize int64
145
146
var inUseSpanSize int64
146
147
var allocSize int64
@@ -154,7 +155,9 @@ func (p *Process) readSpans() {
154
155
min := core .Address (s .Field ("startAddr" ).Uintptr ())
155
156
elemSize := int64 (s .Field ("elemsize" ).Uintptr ())
156
157
nPages := int64 (s .Field ("npages" ).Uintptr ())
158
+ nReleased := int64 (s .Field ("npreleased" ).Uintptr ())
157
159
spanSize := nPages * pageSize
160
+ nReleasedSize := nReleased * pageSize
158
161
max := min .Add (spanSize )
159
162
allSpanSize += spanSize
160
163
switch s .Field ("state" ).Cast ("uint8" ).Uint8 () {
@@ -207,6 +210,7 @@ func (p *Process) readSpans() {
207
210
}
208
211
case spanFree :
209
212
freeSpanSize += spanSize
213
+ releasedSpanSize += nReleasedSize
210
214
case spanDead :
211
215
// These are just deallocated span descriptors. They use no heap.
212
216
case spanManual :
@@ -234,7 +238,10 @@ func (p *Process) readSpans() {
234
238
& Stats {"alloc" , manualAllocSize , nil },
235
239
& Stats {"free" , manualFreeSize , nil },
236
240
}},
237
- & Stats {"free spans" , freeSpanSize , nil },
241
+ & Stats {"free spans" , freeSpanSize , []* Stats {
242
+ & Stats {"retained" , freeSpanSize - releasedSpanSize , nil },
243
+ & Stats {"released" , releasedSpanSize , nil },
244
+ }},
238
245
}},
239
246
& Stats {"ptr bitmap" , bitmap , nil },
240
247
& Stats {"span table" , spanTable , nil },
0 commit comments