Table of Contents

Monitoring

MemoryStreamSlim provides a couple of ways that you can monitor usage, using the Metrics and Events features of the .NET runtime.

Metrics

MemoryStreamSlim provides a few metrics that you can use with tools such as dotnet-counters to monitor the memory usage of MemoryStreamSlim instances in your application.

"kzdev.perfutils.memory" is the counter name for the metrics that are provided by MemoryStreamSlim.

For example, you can use the following command to monitor the MemoryStreamSlim metrics for a specific process by name.

dotnet-counters monitor -n <process-name> --counters "kzdev.perfutils.memory"

Or you can use the following command to monitor the MemoryStreamSlim metrics for a specific process by process id.

dotnet-counters monitor -p <process-id> --counters "kzdev.perfutils.memory"

The following metric counters are available.


MemoryStreamSlim.Count Counter

This counter provides the number of MemoryStreamSlim instances that are currently active in the application. The counter name is memory_stream_slim.count.

Units Description
{instances} The number of active MemoryStreamSlim instances.

SegmentMemory.GCAllocated Counter

This counter provides the number of buffer segments currently allocated from the GC Large Object Heap, if GC Heap memory is being used for the memory buffers. The counter name is segment_memory.gc_allocated.

Units Description
{segments} The total number of GC heap segments (of 64K bytes) allocated for the segmented memory buffers.

SegmentMemory.NativeAllocated Counter

This counter provides the number of buffer segments currently allocated from the native OS heap if native memory is being used for the memory buffers. The counter name is segment_memory.native_allocated.

Units Description
{segments} The total number of native memory segments (of 64K bytes) allocated for the segmented memory buffers.

Events

For detailed monitoring of MemoryStreamSlim instances and memory management, you can use the EventSource events that are provided by the PerfUtils library with tools such as PerfView. The event source name is KZDev.PerfUtils. The following events are available.

MemoryStreamSlimCreate event

This event is raised when a new MemoryStreamSlim instance is created.

The following table shows the task, keyword, level, and opcode.

Task Keyword Level Opcode
MemoryStreamSlim (0x0001) Create (0x0001) Informational (4) Create (11)

The following table shows the event information.

Event Event ID Raised when
MemoryStreamSlimCreate 1 A new MemoryStreamSlim instance is created.

The following table shows the event data.

Name Type Description
StreamId Guid The unique identifier for the MemoryStreamSlim instance.
MaximumCapacity Int32 The maximum capacity set for the MemoryStreamSlim instance.
ZeroBehavior UnicodeString The type of buffer clearing used for the memory buffer segments in this MemoryStreamSlim instance. One of ['None', 'OutOfBand', 'OnRelease']

MemoryStreamSlimDispose event

This event is raised when a MemoryStreamSlim instance is disposed.

The following table shows the task, keyword, level, and opcode.

Task Keyword Level Opcode
MemoryStreamSlim (0x0001) Dispose (0x0002) Informational (4) Dispose (12)

The following table shows the event information.

Event Event ID Raised when
MemoryStreamSlimDispose 2 A MemoryStreamSlim instance is diposed.

The following table shows the event data.

Name Type Description
StreamId Guid The unique identifier for the MemoryStreamSlim instance.

MemoryStreamSlimFinalize event

This event is raised when a MemoryStreamSlim instance finalizer is executed. This event will not be raised if the MemoryStreamSlim instance is disposed properly.

The following table shows the task, keyword, level, and opcode.

Task Keyword Level Opcode
MemoryStreamSlim (0x0001) Finalize (0x0004) Warning (3) Finalize (13)

The following table shows the event information.

Event Event ID Raised when
MemoryStreamSlimFinalize 3 A MemoryStreamSlim instance finalizer is executed.

The following table shows the event data.

Name Type Description
StreamId Guid The unique identifier for the MemoryStreamSlim instance.

MemoryStreamSlimCapacityExpanded event

This event is raised when a MemoryStreamSlim instance capacity is expanded.

The following table shows the task, keyword, level, and opcode.

Task Keyword Level Opcode
MemoryStreamSlim (0x0001) Capacity (0x0010) Informational (4) CapacityExpand (14)

The following table shows the event information.

Event Event ID Raised when
MemoryStreamSlimCapacityExpanded 4 A MemoryStreamSlim instance capacity is expanded.

The following table shows the event data.

Name Type Description
StreamId Guid The unique identifier for the MemoryStreamSlim instance.
OldCapacity Int32 The capacity of the MemoryStreamSlim instance before the capacity expansion.
NewCapacity Int32 The new expanded capacity of the MemoryStreamSlim instance.

MemoryStreamSlimCapacityReduced event

This event is raised when a MemoryStreamSlim instance capacity is reduced.

The following table shows the task, keyword, level, and opcode.

Task Keyword Level Opcode
MemoryStreamSlim (0x0001) Capacity (0x0010) Informational (4) CapacityReduced (15)

The following table shows the event information.

Event Event ID Raised when
MemoryStreamSlimCapacityReduced 5 A MemoryStreamSlim instance capacity is reduced.

The following table shows the event data.

Name Type Description
StreamId Guid The unique identifier for the MemoryStreamSlim instance.
OldCapacity Int32 The capacity of the MemoryStreamSlim instance before the capacity reduction.
NewCapacity Int32 The new reduced capacity of the MemoryStreamSlim instance.

MemoryBufferAllocate event

This event is raised when a memory allocation is made for needed memory buffers.

The following table shows the task, keyword, level, and opcode.

Task Keyword Level Opcode
BufferMemory (0x0002) Memory (0x0008) Informational (4) BufferAllocate (16)

The following table shows the event information.

Event Event ID Raised when
MemoryBufferAllocate 6 A memory allocation was made for needed memory buffers.

The following table shows the event data.

Name Type Description
AllocationSize Int32 The size (in bytes) of the newly allocated memory.
BufferType UnicodeString The type of memory that was allocated. One of ['GC Heap', 'Native']

MemoryBufferRelease event

This event is raised when a previous memory allocation for memory buffers is released.

The following table shows the task, keyword, level, and opcode.

Task Keyword Level Opcode
BufferMemory (0x0002) Memory (0x0008) Informational (4) BufferRelease (17)

The following table shows the event information.

Event Event ID Raised when
MemoryBufferRelease 7 A previous memory allocation for memory buffers is released.

The following table shows the event data.

Name Type Description
ReleaseSize Int32 The size (in bytes) of the released memory.
BufferType UnicodeString The type of memory that was released. One of ['GC Heap', 'Native']

MemoryStreamSlimToArray event

This event is raised when the ToArray() method is called on a MemoryStreamSlim instance and returns a non-zero length array. This is useful for tracking extra heap memory allocations caused by calling the ToArray() method.

The following table shows the task, keyword, level, and opcode.

Task Keyword Level Opcode
MemoryStreamSlim (0x0001) Memory (0x0008) Warning (3) ArrayAllocate (18)

The following table shows the event information.

Event Event ID Raised when
MemoryStreamSlimToArray 8 ToArray() is called on a MemoryStreamSlim instance and returns a non-zero length array result.

The following table shows the event data.

Name Type Description
ArraySize Int32 The size (in bytes) of the returned heap allocated array.

PerfView example

To capture all the events in PerfView from the KZDev.PerfUtils library, you can use the string *KZDev.PerfUtils as an argument to the -providers option of the perfview command line tool. To also capture stack traces for the events, you can use the StacksEnabled command (*KZDev.PerfUtils:@StacksEnabled=true). See the perfview documentation for more information on how to use the tool.