@@ -141,6 +141,7 @@ func (p *Process) readSpans() {
141141 allspans := mheap .Field ("allspans" )
142142 var allSpanSize int64
143143 var freeSpanSize int64
144+ var releasedSpanSize int64
144145 var manualSpanSize int64
145146 var inUseSpanSize int64
146147 var allocSize int64
@@ -154,7 +155,9 @@ func (p *Process) readSpans() {
154155 min := core .Address (s .Field ("startAddr" ).Uintptr ())
155156 elemSize := int64 (s .Field ("elemsize" ).Uintptr ())
156157 nPages := int64 (s .Field ("npages" ).Uintptr ())
158+ nReleased := int64 (s .Field ("npreleased" ).Uintptr ())
157159 spanSize := nPages * pageSize
160+ nReleasedSize := nReleased * pageSize
158161 max := min .Add (spanSize )
159162 allSpanSize += spanSize
160163 switch s .Field ("state" ).Cast ("uint8" ).Uint8 () {
@@ -207,6 +210,7 @@ func (p *Process) readSpans() {
207210 }
208211 case spanFree :
209212 freeSpanSize += spanSize
213+ releasedSpanSize += nReleasedSize
210214 case spanDead :
211215 // These are just deallocated span descriptors. They use no heap.
212216 case spanManual :
@@ -234,7 +238,10 @@ func (p *Process) readSpans() {
234238 & Stats {"alloc" , manualAllocSize , nil },
235239 & Stats {"free" , manualFreeSize , nil },
236240 }},
237- & Stats {"free spans" , freeSpanSize , nil },
241+ & Stats {"free spans" , freeSpanSize , []* Stats {
242+ & Stats {"retained" , freeSpanSize - releasedSpanSize , nil },
243+ & Stats {"released" , releasedSpanSize , nil },
244+ }},
238245 }},
239246 & Stats {"ptr bitmap" , bitmap , nil },
240247 & Stats {"span table" , spanTable , nil },
0 commit comments