{"id":6909,"date":"2025-05-15T15:41:20","date_gmt":"2025-05-15T22:41:20","guid":{"rendered":"https:\/\/devblogs.microsoft.com\/pix\/?p=6909"},"modified":"2025-06-02T14:36:28","modified_gmt":"2025-06-02T21:36:28","slug":"new-memory-profiling-features-in-timing-captures","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/pix\/new-memory-profiling-features-in-timing-captures\/","title":{"rendered":"New memory profiling features in Timing Captures"},"content":{"rendered":"<p>The <a href=\"https:\/\/devblogs.microsoft.com\/pix\/pix-2505-09\/\">2505.09 release<\/a> of PIX on Windows adds several new features to help you optimize your game&#8217;s use of memory.\u00a0 These features include:<\/p>\n<ul>\n<li>A set of metrics that track working set size, page fault count and page file usage.<\/li>\n<li>A new lane in the Timeline that displays the working set size, and the amount of memory allocated by the various allocators throughout the capture.<\/li>\n<li>A new UI layout focused on memory analysis. This layout enables you to analyze the memory allocations and accesses made during the capture. Various data filters are provided to help you find cases where memory is allocated, but then never accessed. Links to the timeline view are provided for all memory accesses.<\/li>\n<\/ul>\n<h3>Memory-related Metrics<\/h3>\n<p>The memory metrics for your game&#8217;s process are available in both the <strong>Metrics<\/strong> layout and the <strong>System Monitor<\/strong>.\u00a0 These counters enable you to track your commit charge, or page file usage, along with the number of page faults and the overall <a href=\"https:\/\/learn.microsoft.com\/en-us\/windows\/win32\/memory\/working-set\">working set size<\/a>.<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/pix\/wp-content\/uploads\/sites\/41\/2025\/05\/winpix_memory_memory_working_set_counters.jpg\"><img decoding=\"async\" class=\"alignnone size-full wp-image-6958\" src=\"https:\/\/devblogs.microsoft.com\/pix\/wp-content\/uploads\/sites\/41\/2025\/05\/winpix_memory_memory_working_set_counters.jpg\" alt=\"winpix memory memory working set counters image\" width=\"1067\" height=\"499\" srcset=\"https:\/\/devblogs.microsoft.com\/pix\/wp-content\/uploads\/sites\/41\/2025\/05\/winpix_memory_memory_working_set_counters.jpg 1067w, https:\/\/devblogs.microsoft.com\/pix\/wp-content\/uploads\/sites\/41\/2025\/05\/winpix_memory_memory_working_set_counters-300x140.jpg 300w, https:\/\/devblogs.microsoft.com\/pix\/wp-content\/uploads\/sites\/41\/2025\/05\/winpix_memory_memory_working_set_counters-1024x479.jpg 1024w, https:\/\/devblogs.microsoft.com\/pix\/wp-content\/uploads\/sites\/41\/2025\/05\/winpix_memory_memory_working_set_counters-768x359.jpg 768w\" sizes=\"(max-width: 1067px) 100vw, 1067px\" \/><\/a><\/p>\n<h3>Memory Usage Lane in the Timeline<\/h3>\n<p>A new lane named <strong>Memory Usage<\/strong> is now available in the <strong>Timeline<\/strong>.\u00a0 The amount of memory allocated per allocator throughout the capture is graphed, along with the working set size for your game&#8217;s process.<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/pix\/wp-content\/uploads\/sites\/41\/2025\/05\/winpix_memory_memory_memory_usage_lane.jpg\"><img decoding=\"async\" class=\"alignnone size-full wp-image-6956\" src=\"https:\/\/devblogs.microsoft.com\/pix\/wp-content\/uploads\/sites\/41\/2025\/05\/winpix_memory_memory_memory_usage_lane.jpg\" alt=\"winpix memory memory memory usage lane image\" width=\"1135\" height=\"340\" srcset=\"https:\/\/devblogs.microsoft.com\/pix\/wp-content\/uploads\/sites\/41\/2025\/05\/winpix_memory_memory_memory_usage_lane.jpg 1135w, https:\/\/devblogs.microsoft.com\/pix\/wp-content\/uploads\/sites\/41\/2025\/05\/winpix_memory_memory_memory_usage_lane-300x90.jpg 300w, https:\/\/devblogs.microsoft.com\/pix\/wp-content\/uploads\/sites\/41\/2025\/05\/winpix_memory_memory_memory_usage_lane-1024x307.jpg 1024w, https:\/\/devblogs.microsoft.com\/pix\/wp-content\/uploads\/sites\/41\/2025\/05\/winpix_memory_memory_memory_usage_lane-768x230.jpg 768w\" sizes=\"(max-width: 1135px) 100vw, 1135px\" \/><\/a><\/p>\n<h3>Memory Analysis Layout<\/h3>\n<p>The Memory layout is used to analyze memory allocations, reads and writes collected when the <strong>Memory Access Sampling<\/strong>\u00a0checkbox is selected before starting a Timing Capture.<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/pix\/wp-content\/uploads\/sites\/41\/2025\/05\/winpix_memory_memory_memory_access_sampling_setting.jpg\"><img decoding=\"async\" class=\"alignnone size-full wp-image-6962\" src=\"https:\/\/devblogs.microsoft.com\/pix\/wp-content\/uploads\/sites\/41\/2025\/05\/winpix_memory_memory_memory_access_sampling_setting.jpg\" alt=\"winpix memory memory memory access sampling setting image\" width=\"418\" height=\"575\" srcset=\"https:\/\/devblogs.microsoft.com\/pix\/wp-content\/uploads\/sites\/41\/2025\/05\/winpix_memory_memory_memory_access_sampling_setting.jpg 418w, https:\/\/devblogs.microsoft.com\/pix\/wp-content\/uploads\/sites\/41\/2025\/05\/winpix_memory_memory_memory_access_sampling_setting-218x300.jpg 218w\" sizes=\"(max-width: 418px) 100vw, 418px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>The primary user interface elements of the Memory layout are shown in the following figure.<\/p>\n<ul>\n<li><strong>Memory Usage graph.\u00a0 <\/strong>A graph showing the working set size, and the amount of memory allocated by each type of allocator over the duration of the capture.<\/li>\n<li><strong>Controls to start analysis.<\/strong>\u00a0A set of user interface controls for starting memory analysis.<\/li>\n<li><strong>Memory map.<\/strong>\u00a0A map of all memory allocations made during the selected time range.<\/li>\n<li><strong>Analysis filters.<\/strong>\u00a0The user interface controls used to filter the memory map based on a set of predefined criteria.<\/li>\n<li><strong>Control used to start animation.<\/strong>\u00a0A control to start the animation needed to view individual memory accesses.<\/li>\n<li><strong>Memory allocation details panel.<\/strong>\u00a0 A panel that provides details about the memory allocation that is selected in the memory map.<\/li>\n<li><strong>Memory analysis pivot table.<\/strong>\u00a0 A pivot table for analyzing the data based on a set of predefined criteria. The pivots shown in the following figure are <em>Allocation Thread<\/em> and <em>Allocation PIX event stack<\/em>.<\/li>\n<\/ul>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/pix\/wp-content\/uploads\/sites\/41\/2025\/05\/winpix_memory_memory_layout_overview.jpg\"><img decoding=\"async\" class=\"alignnone size-full wp-image-6915\" src=\"https:\/\/devblogs.microsoft.com\/pix\/wp-content\/uploads\/sites\/41\/2025\/05\/winpix_memory_memory_layout_overview.jpg\" alt=\"winpix memory memory layout overview image\" width=\"1185\" height=\"700\" srcset=\"https:\/\/devblogs.microsoft.com\/pix\/wp-content\/uploads\/sites\/41\/2025\/05\/winpix_memory_memory_layout_overview.jpg 1185w, https:\/\/devblogs.microsoft.com\/pix\/wp-content\/uploads\/sites\/41\/2025\/05\/winpix_memory_memory_layout_overview-300x177.jpg 300w, https:\/\/devblogs.microsoft.com\/pix\/wp-content\/uploads\/sites\/41\/2025\/05\/winpix_memory_memory_layout_overview-1024x605.jpg 1024w, https:\/\/devblogs.microsoft.com\/pix\/wp-content\/uploads\/sites\/41\/2025\/05\/winpix_memory_memory_layout_overview-768x454.jpg 768w\" sizes=\"(max-width: 1185px) 100vw, 1185px\" \/><\/a><\/p>\n<h4>Running Memory Analysis<\/h4>\n<p>The memory map is not populated when a capture is initially opened. To populate the map, select a region of time in the\u00a0<strong>Memory Usage<\/strong>\u00a0graph, select a memory type from the\u00a0<strong>Memory Type<\/strong>\u00a0dropdown and click the\u00a0<strong>Analyze<\/strong>\u00a0button.<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/pix\/wp-content\/uploads\/sites\/41\/2025\/05\/winpix_memory_memory_layout_analyze.jpg\"><img decoding=\"async\" class=\"alignnone size-full wp-image-6918\" src=\"https:\/\/devblogs.microsoft.com\/pix\/wp-content\/uploads\/sites\/41\/2025\/05\/winpix_memory_memory_layout_analyze.jpg\" alt=\"winpix memory memory layout analyze image\" width=\"470\" height=\"297\" srcset=\"https:\/\/devblogs.microsoft.com\/pix\/wp-content\/uploads\/sites\/41\/2025\/05\/winpix_memory_memory_layout_analyze.jpg 470w, https:\/\/devblogs.microsoft.com\/pix\/wp-content\/uploads\/sites\/41\/2025\/05\/winpix_memory_memory_layout_analyze-300x190.jpg 300w\" sizes=\"(max-width: 470px) 100vw, 470px\" \/><\/a><\/p>\n<p>The memory map is organized by memory address. Each box in the map represents a memory allocation at a particular address. The size of each box is relative to the size of the allocation. The boxes in the memory map are colored based on the legend to the left of the map. The following figure shows a memory map colored by memory type: CPU and GPU.<\/p>\n<p>Selecting an allocation populates the <strong>Memory allocation details<\/strong> panel in the analysis panel with detailed information about that allocation, including its address, size, page size, allocator and callstack.<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/pix\/wp-content\/uploads\/sites\/41\/2025\/05\/winpix_memory_memory_layout_populated_map.jpg\"><img decoding=\"async\" class=\"alignnone size-full wp-image-6919\" src=\"https:\/\/devblogs.microsoft.com\/pix\/wp-content\/uploads\/sites\/41\/2025\/05\/winpix_memory_memory_layout_populated_map.jpg\" alt=\"winpix memory memory layout populated map image\" width=\"1320\" height=\"710\" srcset=\"https:\/\/devblogs.microsoft.com\/pix\/wp-content\/uploads\/sites\/41\/2025\/05\/winpix_memory_memory_layout_populated_map.jpg 1320w, https:\/\/devblogs.microsoft.com\/pix\/wp-content\/uploads\/sites\/41\/2025\/05\/winpix_memory_memory_layout_populated_map-300x161.jpg 300w, https:\/\/devblogs.microsoft.com\/pix\/wp-content\/uploads\/sites\/41\/2025\/05\/winpix_memory_memory_layout_populated_map-1024x551.jpg 1024w, https:\/\/devblogs.microsoft.com\/pix\/wp-content\/uploads\/sites\/41\/2025\/05\/winpix_memory_memory_layout_populated_map-768x413.jpg 768w\" sizes=\"(max-width: 1320px) 100vw, 1320px\" \/><\/a><\/p>\n<p>The allocations shown in the memory map can be filtered in various ways using the\u00a0<strong>Lifetime<\/strong>, <strong>Allocation Size<\/strong>,\u00a0<strong>Access Sample Count<\/strong>\u00a0and\u00a0<strong>Alloc Page Size<\/strong>\u00a0dropdowns. For example, the\u00a0<strong>Lifetime<\/strong>\u00a0dropdown can be used to filter the allocations that were made during the selected time, but were not freed by the end of the analysis window. These allocations represent potential memory leaks. Using the\u00a0<strong>Access Sample Count<\/strong>\u00a0filter to display only those allocations that were never accessed can help find memory that was allocated, but never used.<\/p>\n<p>Use the pivot table to analyze the total amount of memory allocated in the selected region of time. The amount of memory allocated can be pivoted by various criteria including the allocating thread, and callstack and PIX event trees. In the following figure, the total amount of memory allocated is pivoted first by thread and then by the callstacks that allocated the memory.<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/pix\/wp-content\/uploads\/sites\/41\/2025\/05\/winpix_memory_memory_layout_pivot_table.jpg\"><img decoding=\"async\" class=\"alignnone size-full wp-image-6922\" src=\"https:\/\/devblogs.microsoft.com\/pix\/wp-content\/uploads\/sites\/41\/2025\/05\/winpix_memory_memory_layout_pivot_table.jpg\" alt=\"winpix memory memory layout pivot table image\" width=\"711\" height=\"439\" srcset=\"https:\/\/devblogs.microsoft.com\/pix\/wp-content\/uploads\/sites\/41\/2025\/05\/winpix_memory_memory_layout_pivot_table.jpg 711w, https:\/\/devblogs.microsoft.com\/pix\/wp-content\/uploads\/sites\/41\/2025\/05\/winpix_memory_memory_layout_pivot_table-300x185.jpg 300w\" sizes=\"(max-width: 711px) 100vw, 711px\" \/><\/a><\/p>\n<p>An option is provided to condense stack frames when the pivot table is pivoted by either <strong>Allocation Call Stack<\/strong>\u00a0or\u00a0<strong>Allocation PIX Event Stack<\/strong>. If a node in a stack tree has only one child, when condensed, that child node is removed and replaced with a visual indicator. Condensing stack trees makes it faster to navigate portions of the tree that have only one child. The amount of horizontal space is also optimized when stack trees are condensed. To condense a stack, select the\u00a0<strong>Condense Frames<\/strong>\u00a0option from the settings icon in the view.<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/pix\/wp-content\/uploads\/sites\/41\/2025\/05\/winpix_memory_memory_layout_pivot_table_condense_frames.jpg\"><img decoding=\"async\" class=\"alignnone size-full wp-image-6925\" src=\"https:\/\/devblogs.microsoft.com\/pix\/wp-content\/uploads\/sites\/41\/2025\/05\/winpix_memory_memory_layout_pivot_table_condense_frames.jpg\" alt=\"winpix memory memory layout pivot table condense frames image\" width=\"1002\" height=\"473\" srcset=\"https:\/\/devblogs.microsoft.com\/pix\/wp-content\/uploads\/sites\/41\/2025\/05\/winpix_memory_memory_layout_pivot_table_condense_frames.jpg 1002w, https:\/\/devblogs.microsoft.com\/pix\/wp-content\/uploads\/sites\/41\/2025\/05\/winpix_memory_memory_layout_pivot_table_condense_frames-300x142.jpg 300w, https:\/\/devblogs.microsoft.com\/pix\/wp-content\/uploads\/sites\/41\/2025\/05\/winpix_memory_memory_layout_pivot_table_condense_frames-768x363.jpg 768w\" sizes=\"(max-width: 1002px) 100vw, 1002px\" \/><\/a><\/p>\n<h4 id=\"analyzing-memory-access-samples\" class=\"heading-anchor\">Analyzing memory access samples<\/h4>\n<p>Detailed information about each memory access, including a link to the <strong>Timeline<\/strong> at the point in time when the access occurred, along with its callstack, can be obtained by running a memory animation of the selected region of time. Use the <strong>Memory Animation<\/strong>\u00a0button to run the animation. When running the animation, PIX processes each memory access in time-order fashion, highlighting the accesses in the map. Memory reads are highlighted in one color, and memory writes are highlighted in another. The following figure shows the memory map as an animation is running.<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/pix\/wp-content\/uploads\/sites\/41\/2025\/05\/winpix_memory_memory_layout_animation.jpg\"><img decoding=\"async\" class=\"alignnone size-full wp-image-6927\" src=\"https:\/\/devblogs.microsoft.com\/pix\/wp-content\/uploads\/sites\/41\/2025\/05\/winpix_memory_memory_layout_animation.jpg\" alt=\"winpix memory memory layout animation image\" width=\"689\" height=\"481\" srcset=\"https:\/\/devblogs.microsoft.com\/pix\/wp-content\/uploads\/sites\/41\/2025\/05\/winpix_memory_memory_layout_animation.jpg 689w, https:\/\/devblogs.microsoft.com\/pix\/wp-content\/uploads\/sites\/41\/2025\/05\/winpix_memory_memory_layout_animation-300x209.jpg 300w\" sizes=\"(max-width: 689px) 100vw, 689px\" \/><\/a><\/p>\n<p>As memory accesses are analyzed, hyperlinks and callstacks for each allocation and access are populated in the panel to the right hand side of the map. Clicking on a hyperlink navigates to the CPU sample in the Timeline that resulted in the memory access.<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/pix\/wp-content\/uploads\/sites\/41\/2025\/05\/winpix_memory_memory_layout_access_sample_links.jpg\"><img decoding=\"async\" class=\"alignnone size-full wp-image-6928\" src=\"https:\/\/devblogs.microsoft.com\/pix\/wp-content\/uploads\/sites\/41\/2025\/05\/winpix_memory_memory_layout_access_sample_links.jpg\" alt=\"winpix memory memory layout access sample links image\" width=\"512\" height=\"482\" srcset=\"https:\/\/devblogs.microsoft.com\/pix\/wp-content\/uploads\/sites\/41\/2025\/05\/winpix_memory_memory_layout_access_sample_links.jpg 512w, https:\/\/devblogs.microsoft.com\/pix\/wp-content\/uploads\/sites\/41\/2025\/05\/winpix_memory_memory_layout_access_sample_links-300x282.jpg 300w, https:\/\/devblogs.microsoft.com\/pix\/wp-content\/uploads\/sites\/41\/2025\/05\/winpix_memory_memory_layout_access_sample_links-24x24.jpg 24w\" sizes=\"(max-width: 512px) 100vw, 512px\" \/><\/a><\/p>\n<p>As always, keep the bug reports and feature requests coming by clicking the PIX Feedback icon in the upper right corner of the UI.<\/p>\n<p>Steven.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>The 2505.09 release of PIX on Windows adds several new features to help you optimize your game&#8217;s use of memory.\u00a0 These features include: A set of metrics that track working set size, page fault count and page file usage. A new lane in the Timeline that displays the working set size, and the amount of [&hellip;]<\/p>\n","protected":false},"author":1915,"featured_media":6915,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-6909","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-pix"],"acf":[],"blog_post_summary":"<p>The 2505.09 release of PIX on Windows adds several new features to help you optimize your game&#8217;s use of memory.\u00a0 These features include: A set of metrics that track working set size, page fault count and page file usage. A new lane in the Timeline that displays the working set size, and the amount of [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/pix\/wp-json\/wp\/v2\/posts\/6909","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/pix\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/pix\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/pix\/wp-json\/wp\/v2\/users\/1915"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/pix\/wp-json\/wp\/v2\/comments?post=6909"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/pix\/wp-json\/wp\/v2\/posts\/6909\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/pix\/wp-json\/wp\/v2\/media\/6915"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/pix\/wp-json\/wp\/v2\/media?parent=6909"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/pix\/wp-json\/wp\/v2\/categories?post=6909"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/pix\/wp-json\/wp\/v2\/tags?post=6909"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}