Course contentsShow
← Unity Game Development
Lesson 724 of 82811. Performance and Data PersistenceFree lesson

Visualizing Allocation Spikes in Memory

Use the Memory Profiler to track managed heap allocations and identify which objects are triggering frequent garbage collection cycles.

In this lesson, you will learn how to use the Unity Memory Profiler to isolate managed heap allocations that trigger frequent Garbage Collection (GC) cycles.

Identifying the Source of Allocation Spikes

While the CPU Profiler helps us spot when a frame takes too long, the Memory Profiler helps us understand why memory is being churned. Frequent "GC spikes" occur when your application allocates temporary objects on the managed heap that the Garbage Collector must later reclaim. If these allocations happen every frame—like creating new strings or arrays—the GC will trigger repeatedly, causing intermittent stuttering.

Using the Memory Profiler for Deep Inspection

To track these spikes, follow these steps:

  1. Capture a Snapshot: Open the Window > Analysis > Memory Profiler and click Capture while your game is running and exhibiting performance drops.
  2. Compare Snapshots: Take one snapshot during idle and another during an action-heavy moment. Compare them in the Compare view.
  3. Trace the Allocation Stack: Look for items with high "Instance Count" or large "Total Size." Frequently, these are caused by common patterns like string concatenation inside Update() or LINQ queries.

Consider this problematic code, which causes an allocation spike every frame:

void Update() {
    // This creates a new string object every frame, forcing a GC collection
    Debug.Log("Player position: " + transform.position.ToString());
}

By inspecting the Memory Profiler’s Allocation Call Stack, you can pinpoint the exact line of code creating these objects. Once identified, you can optimize them using techniques like StringBuilder or object pooling to reuse existing memory rather than requesting new blocks from the heap.

When you observe a "sawtooth" pattern in the Memory Profiler’s graph, it indicates that your managed heap is growing until it hits a threshold, forcing the GC to kick in. Your goal is to flatten this graph by reducing unnecessary allocations in hot paths like Update() or FixedUpdate(), ensuring a smooth frame rate without the interruption of memory cleanup cycles.

Key Takeaway: Use the Memory Profiler to track the allocation call stack of objects in your managed heap, allowing you to remove temporary allocations in high-frequency loops that force unnecessary Garbage Collection cycles.