{
    "componentChunkName": "component---src-templates-blog-post-js",
    "path": "/en/chrome-gc/",
    "result": {"data":{"site":{"siteMetadata":{"title":"지나가던 개발(zigae)","author":"geonwoo","lang":"ko"}},"markdownRemark":{"id":"e16236b2-9e9e-598f-9fa4-442eb88d3115","excerpt":"Written against V8 v11.x. This goes past the usual “what is a garbage collector” tour and into how V8 handles millions of function calls per second and…","html":"<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/00f64a7ad051895c7e915b2e5b38faaf/857b3/v8-thumbnail.jpg\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 66.87116564417178%; position: relative; bottom: 0; left: 0; background-image: url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAEEA//EABUBAQEAAAAAAAAAAAAAAAAAAAID/9oADAMBAAIQAxAAAAGBmQVAig//xAAbEAEAAgIDAAAAAAAAAAAAAAABAAIDERITMf/aAAgBAQABBQJ8Max6982gXsup/8QAFhEAAwAAAAAAAAAAAAAAAAAAARAR/9oACAEDAQE/AaF//8QAFhEAAwAAAAAAAAAAAAAAAAAAARAR/9oACAECAQE/AYV//8QAHBAAAgEFAQAAAAAAAAAAAAAAAAERAhAhMTKh/9oACAEBAAY/ApSSM0+HBCNu3//EABsQAQADAQADAAAAAAAAAAAAAAEAESExYaHx/9oACAEBAAE/IUJsTW7caeJFdMQB+EA+xuBe6+Z//9oADAMBAAIAAwAAABCrz//EABYRAQEBAAAAAAAAAAAAAAAAAAEQEf/aAAgBAwEBPxDAJ//EABYRAAMAAAAAAAAAAAAAAAAAAAEQIf/aAAgBAgEBPxCpX//EABwQAQEBAAEFAAAAAAAAAAAAAAERAEEhMVFhsf/aAAgBAQABPxAFYmC/EKoi+rqa6MJVytKNjYryZEWTl/tw1Nue7f/Z'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"engine\"\n        title=\"engine\"\n        src=\"/static/00f64a7ad051895c7e915b2e5b38faaf/6aca1/v8-thumbnail.jpg\"\n        srcset=\"/static/00f64a7ad051895c7e915b2e5b38faaf/d2f63/v8-thumbnail.jpg 163w,\n/static/00f64a7ad051895c7e915b2e5b38faaf/c989d/v8-thumbnail.jpg 325w,\n/static/00f64a7ad051895c7e915b2e5b38faaf/6aca1/v8-thumbnail.jpg 650w,\n/static/00f64a7ad051895c7e915b2e5b38faaf/7c09c/v8-thumbnail.jpg 975w,\n/static/00f64a7ad051895c7e915b2e5b38faaf/01ab0/v8-thumbnail.jpg 1300w,\n/static/00f64a7ad051895c7e915b2e5b38faaf/857b3/v8-thumbnail.jpg 6000w\"\n        sizes=\"(max-width: 650px) 100vw, 650px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n  </a>\n    </span></p>\n<blockquote>\n<p>Written against V8 v11.x. This goes past the usual “what is a garbage collector” tour and into how V8 handles millions of function calls per second and gigabytes of heap without the user noticing.</p>\n</blockquote>\n<h2 id=\"where-it-starts-how-v8-represents-an-object\" style=\"position:relative;\"><a href=\"#where-it-starts-how-v8-represents-an-object\" aria-label=\"where it starts how v8 represents an object permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Where it starts: how V8 represents an object</h2>\n<p>JavaScript went from a scripting language to a platform for real applications largely because V8 got good at managing memory. Early V8 stopped the world for tens of milliseconds at a time; today the same work finishes in single-digit milliseconds. The story of how that happened starts one level below the collector, with the way objects are laid out in the first place.</p>\n<h3 id=\"hidden-classes\" style=\"position:relative;\"><a href=\"#hidden-classes\" aria-label=\"hidden classes permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Hidden Classes</h3>\n<p>Internally every JavaScript object is a <code class=\"language-text\">HeapObject</code>, and it looks roughly like this:</p>\n<div class=\"gatsby-highlight\" data-language=\"cpp\"><pre class=\"language-cpp\"><code class=\"language-cpp\"><span class=\"token comment\">// V8's internal object layout (simplified)</span>\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">HeapObject</span> <span class=\"token punctuation\">{</span>\n  Map<span class=\"token operator\">*</span> map_<span class=\"token punctuation\">;</span>           <span class=\"token comment\">// Hidden Class pointer (4/8 bytes)</span>\n  Properties<span class=\"token operator\">*</span> props_<span class=\"token punctuation\">;</span>  <span class=\"token comment\">// dynamic property backing store</span>\n  Elements<span class=\"token operator\">*</span> elements_<span class=\"token punctuation\">;</span> <span class=\"token comment\">// array element backing store</span>\n  <span class=\"token comment\">// ... inline properties</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p><strong>Hidden Classes</strong> (Maps, in V8’s own vocabulary) are the trick that lets a dynamically typed language reach statically typed performance. Every time an object’s shape changes, V8 transitions it to a new Hidden Class, and those transitions feed the Inline Cache (IC) that makes property access fast.</p>\n<p>That’s the payoff. The cost is that this is a lot of structure to keep alive, and keeping it alive cheaply is what the rest of this post is about.</p>\n<h3 id=\"why-this-is-hard\" style=\"position:relative;\"><a href=\"#why-this-is-hard\" aria-label=\"why this is hard permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Why this is hard</h3>\n<p>A modern web app holds a large heap, animates at 60FPS and expects to stay responsive while doing it. The collector has to solve four problems at once:</p>\n<ol>\n<li><strong>Latency vs throughput</strong>: keep pause times short without letting the heap grow unbounded</li>\n<li><strong>Fragmentation</strong>: an SPA that runs for hours will fragment its heap if you let it</li>\n<li><strong>Cross-heap references</strong>: JavaScript and WebAssembly pointing at each other’s objects</li>\n<li><strong>Incremental and concurrent work</strong>: collecting without blocking the main thread</li>\n</ol>\n<p>Chrome’s Site Isolation raises the stakes further: every iframe gets its own V8 isolate, so per-isolate memory efficiency multiplies. V8’s first answer to all of this is the shape of the heap itself.</p>\n<h2 id=\"the-core-strategy-a-generational-heap\" style=\"position:relative;\"><a href=\"#the-core-strategy-a-generational-heap\" aria-label=\"the core strategy a generational heap permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>The core strategy: a generational heap</h2>\n<h3 id=\"layout-and-allocation\" style=\"position:relative;\"><a href=\"#layout-and-allocation\" aria-label=\"layout and allocation permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Layout and allocation</h3>\n<p>V8’s heap is more than a Young/Old split. The real structure is layered:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">V8 Heap (tens of MB to a few GB)\n├── Young Generation (1-32MB)\n│   ├── Nursery (Semi-space 1)\n│   ├── Intermediate (Semi-space 2)\n│   └── Survivor Space\n├── Old Generation\n│   ├── Old Object Space\n│   ├── Code Space (executable code)\n│   ├── Map Space (Hidden Classes)\n│   └── Large Object Space (objects >256KB)\n└── Non-movable Spaces\n    ├── Read-only Space\n    └── Shared Space (cross-isolate)</code></pre></div>\n<p>Splitting the heap by object lifetime lets each region be collected the way that suits it. Allocation itself is nearly free: each thread gets its own <strong>TLAB (Thread-Local Allocation Buffer)</strong> so threads don’t contend, and inside a TLAB allocation is a bump pointer, which is O(1).</p>\n<p>All of which rests on one assumption. We’ll get to whether it holds.</p>\n<h3 id=\"promotion\" style=\"position:relative;\"><a href=\"#promotion\" aria-label=\"promotion permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Promotion</h3>\n<p>Promotion from Young to Old isn’t a simple age counter. V8 uses a mix of heuristics:</p>\n<ol>\n<li><strong>Age-based</strong>: survive two scavenges and you’re promoted</li>\n<li><strong>Size-based</strong>: if To-space is more than 25% full, promote immediately</li>\n<li><strong>Pretenuring</strong>: allocation-site feedback sends objects straight to Old Space from the start</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// Pretenuring: V8 learns the pattern</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">createLargeObject</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Array</span><span class=\"token punctuation\">(</span><span class=\"token number\">1000000</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// after enough calls, allocated directly in Old Space</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>The <strong>write barrier</strong> is what makes generational collection possible at all. When an old object starts pointing at a young one, that slot goes into a remembered set and is treated as a root during Minor GC:</p>\n<div class=\"gatsby-highlight\" data-language=\"cpp\"><pre class=\"language-cpp\"><code class=\"language-cpp\"><span class=\"token comment\">// Write barrier (simplified)</span>\n<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token function\">is_old_object</span><span class=\"token punctuation\">(</span>obj<span class=\"token punctuation\">)</span> <span class=\"token operator\">&amp;&amp;</span> <span class=\"token function\">is_young_object</span><span class=\"token punctuation\">(</span>value<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  remembered_set<span class=\"token punctuation\">.</span><span class=\"token function\">insert</span><span class=\"token punctuation\">(</span>obj_address<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/9d7113587be2ab2b8ac3dc93c9c7828c/9c701/v8.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 84.04907975460122%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAARCAYAAADdRIy+AAAACXBIWXMAAAsTAAALEwEAmpwYAAACVklEQVQ4y61U2XLaQBD0//9UKnFsjDECA7qP1Upg0IXDZWTAdGaGo4KPPKSiqtZqD/X29OzsFejZ7/f4Hw/zXJ3Ittst6tdX1PUr1uta8PKyFvAYQ/rrtczVdX0e32w2Z1FX/NrtdlCxRhCE8P0AruvBcTxpfRprNh/QaLTgecF53vMP32EYURsK6Zlws9kiUooWukIQRhGCMIRl2TCMRzTuWrj+2UDzvo1uty+bOY4Ly3ak5Q1Y9QXhgSTCfD5HUVQoyymSZATTcmE7PuI4QaxTZFmO5XKJxWIhCEMlG7MVl4REpkhlWU0RxROEOoPx6EMlOZSeYDp9pnXs44sQnkg53MHAkvFPCGNU1TPG+QzDp5JUJ9BpJv2irI5kCyFbHUnZy4FpYbX6hDCOY1HCBKNxgTQdIUknyMoFhVqQFSXS4YQwpiQOafMpbarQH5hfE7J3IYWYjCr4aoxATeAGQwotIi8DdHoB2l0PDx0XT+MMWifHkC883AghYzabYzzJkeUVhqQk1iNJDof3azYjkhxeEFOoitYUNK9hmvZHwoik8zE4KNWSPTbcdX2BaToyb9MxuW+1RVWvb0qG+ei8y/JBYUxZjuj4fAXbdskvGze3LTz2LOlrUsjncl3XHxXyseFMH9qPaHdM/Ljt49t1B99vengw+mSHpgrypQQvCLmMgoBLKTzjvUL2ipW1jR7umoZkV6lIbLgg5FrWSSrqWCmXH/vGIVkMy6GKcQ4tkTKsY5/neT1fLkL42dX19ranTd5o0e6vYCG89uL6On38iX+5B0///QZt//dFNwg9PgAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"v8\"\n        title=\"v8\"\n        src=\"/static/9d7113587be2ab2b8ac3dc93c9c7828c/a6d36/v8.png\"\n        srcset=\"/static/9d7113587be2ab2b8ac3dc93c9c7828c/222b7/v8.png 163w,\n/static/9d7113587be2ab2b8ac3dc93c9c7828c/ff46a/v8.png 325w,\n/static/9d7113587be2ab2b8ac3dc93c9c7828c/a6d36/v8.png 650w,\n/static/9d7113587be2ab2b8ac3dc93c9c7828c/e548f/v8.png 975w,\n/static/9d7113587be2ab2b8ac3dc93c9c7828c/3c492/v8.png 1300w,\n/static/9d7113587be2ab2b8ac3dc93c9c7828c/9c701/v8.png 1774w\"\n        sizes=\"(max-width: 650px) 100vw, 650px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n  </a>\n    </span></p>\n<h3 id=\"does-the-hypothesis-hold\" style=\"position:relative;\"><a href=\"#does-the-hypothesis-hold\" aria-label=\"does the hypothesis hold permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Does the hypothesis hold?</h3>\n<p>V8’s own measurements say yes, emphatically:</p>\n<ul>\n<li><strong>95%</strong> of objects die at their first scavenge</li>\n<li>only <strong>2%</strong> are ever promoted to the Old Generation</li>\n<li>Young Generation GC takes <strong>10-50ms</strong>; Old Generation GC takes <strong>100-1000ms</strong></li>\n</ul>\n<p>Which explains why generational collection works so well, right up until you put React on top of it, where the assumption comes apart.</p>\n<h3 id=\"react-and-v8s-gc-in-conflict\" style=\"position:relative;\"><a href=\"#react-and-v8s-gc-in-conflict\" aria-label=\"react and v8s gc in conflict permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>React and V8’s GC, in conflict</h3>\n<h4 id=\"1-what-fiber-does-to-the-heap\" style=\"position:relative;\"><a href=\"#1-what-fiber-does-to-the-heap\" aria-label=\"1 what fiber does to the heap permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>1. What Fiber does to the heap</h4>\n<p>The Fiber architecture that landed in React 16 runs almost exactly counter to the generational hypothesis.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// React Fiber node (simplified)</span>\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">FiberNode</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">element</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>type <span class=\"token operator\">=</span> element<span class=\"token punctuation\">.</span>type<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>key <span class=\"token operator\">=</span> element<span class=\"token punctuation\">.</span>key<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>props <span class=\"token operator\">=</span> element<span class=\"token punctuation\">.</span>props<span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">// these references are the whole problem</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>child <span class=\"token operator\">=</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span>      <span class=\"token comment\">// child fiber</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>sibling <span class=\"token operator\">=</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span>    <span class=\"token comment\">// sibling fiber</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>return <span class=\"token operator\">=</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span>     <span class=\"token comment\">// parent fiber</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>alternate <span class=\"token operator\">=</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span>  <span class=\"token comment\">// previous render's fiber (double buffering)</span>\n\n    <span class=\"token comment\">// and these survive a long time</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>memoizedState <span class=\"token operator\">=</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span>     <span class=\"token comment\">// hook state</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>memoizedProps <span class=\"token operator\">=</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span>     <span class=\"token comment\">// previous props</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>updateQueue <span class=\"token operator\">=</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span>       <span class=\"token comment\">// update queue</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// the fiber tree in a real app</span>\n<span class=\"token keyword\">const</span> fiberRoot <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  current<span class=\"token operator\">:</span> rootFiber<span class=\"token punctuation\">,</span>        <span class=\"token comment\">// current tree (promoted to Old Generation)</span>\n  workInProgress<span class=\"token operator\">:</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">,</span>      <span class=\"token comment\">// in-progress tree (Young Generation)</span>\n  pendingTime<span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n  finishedWork<span class=\"token operator\">:</span> <span class=\"token keyword\">null</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Three consequences. Fiber nodes live as long as the component is mounted. Every render keeps an alternate fiber around for double buffering. And the whole tree ends up in the Old Generation, which is the expensive one to collect.</p>\n<h4 id=\"2-hooks-and-closures\" style=\"position:relative;\"><a href=\"#2-hooks-and-closures\" aria-label=\"2 hooks and closures permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>2. Hooks and closures</h4>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// the classic leak</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">ExpensiveComponent</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>data<span class=\"token punctuation\">,</span> setData<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">useState</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token function\">useEffect</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// this closure captures the entire component scope</span>\n    <span class=\"token keyword\">const</span> timer <span class=\"token operator\">=</span> <span class=\"token function\">setInterval</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n      <span class=\"token function\">setData</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">prev</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">[</span><span class=\"token operator\">...</span>prev<span class=\"token punctuation\">,</span> <span class=\"token function\">generateLargeObject</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">// forget this return and you've leaked</span>\n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token function\">clearInterval</span><span class=\"token punctuation\">(</span>timer<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// empty deps still allocates the closure</span>\n\n  <span class=\"token comment\">// a fresh function every render, so more pressure on the Young Generation</span>\n  <span class=\"token keyword\">const</span> handleClick <span class=\"token operator\">=</span> <span class=\"token function\">useCallback</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// captures all of data</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span>data<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// a hook pattern V8 has trouble with</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">useComplexState</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>state<span class=\"token punctuation\">,</span> setState<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">useState</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// runs exactly once, but V8 can't easily know that</span>\n    <span class=\"token keyword\">return</span> <span class=\"token function\">createExpensiveInitialState</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token comment\">// the hook linked list is more work for the collector</span>\n  <span class=\"token keyword\">const</span> hook <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n    memoizedState<span class=\"token operator\">:</span> state<span class=\"token punctuation\">,</span>\n    queue<span class=\"token operator\">:</span> updateQueue<span class=\"token punctuation\">,</span>\n    next<span class=\"token operator\">:</span> nextHook\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h4 id=\"3-the-cost-of-reconciliation\" style=\"position:relative;\"><a href=\"#3-the-cost-of-reconciliation\" aria-label=\"3 the cost of reconciliation permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>3. The cost of reconciliation</h4>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token comment\">// how virtual DOM objects get made</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">createElement</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">type<span class=\"token punctuation\">,</span> props<span class=\"token punctuation\">,</span> <span class=\"token operator\">...</span>children</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">{</span>\n    $$<span class=\"token keyword\">typeof</span><span class=\"token operator\">:</span> <span class=\"token constant\">REACT_ELEMENT_TYPE</span><span class=\"token punctuation\">,</span>\n    type<span class=\"token punctuation\">,</span>\n    key<span class=\"token operator\">:</span> props<span class=\"token operator\">?.</span>key <span class=\"token operator\">||</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">,</span>\n    ref<span class=\"token operator\">:</span> props<span class=\"token operator\">?.</span>ref <span class=\"token operator\">||</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">,</span>\n    props<span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token operator\">...</span>props<span class=\"token punctuation\">,</span> children <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    _owner<span class=\"token operator\">:</span> currentOwner  <span class=\"token comment\">// fiber reference</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// temporaries, one full set per render</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// every one of these lands in the Young Generation</span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>container<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token punctuation\">{</span>items<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">item</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">(</span>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Item</span></span>\n          <span class=\"token attr-name\">key</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>item<span class=\"token punctuation\">.</span>id<span class=\"token punctuation\">}</span></span>\n          <span class=\"token attr-name\">data</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>item<span class=\"token punctuation\">}</span></span>\n          <span class=\"token attr-name\">onClick</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token function\">handleClick</span><span class=\"token punctuation\">(</span>item<span class=\"token punctuation\">.</span>id<span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span></span>\n        <span class=\"token punctuation\">/></span></span>\n      <span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span><span class=\"token plain-text\">\n    </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token comment\">// and most of it is garbage the moment reconciliation ends</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// plus the work objects reconciliation itself allocates</span>\n<span class=\"token keyword\">const</span> updatePayload <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  type<span class=\"token operator\">:</span> <span class=\"token string\">'UPDATE'</span><span class=\"token punctuation\">,</span>\n  fiber<span class=\"token operator\">:</span> currentFiber<span class=\"token punctuation\">,</span>\n  partialState<span class=\"token operator\">:</span> newState<span class=\"token punctuation\">,</span>\n  callback<span class=\"token operator\">:</span> commitCallback<span class=\"token punctuation\">,</span>\n  next<span class=\"token operator\">:</span> <span class=\"token keyword\">null</span>  <span class=\"token comment\">// update queue linked list</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>To be fair to React, this is the shape of the problem, not a mistake. The garbage is short-lived, which is exactly what scavenging is good at. The trouble is the part that isn’t garbage.</p>\n<h4 id=\"4-what-devtools-adds\" style=\"position:relative;\"><a href=\"#4-what-devtools-adds\" aria-label=\"4 what devtools adds permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>4. What DevTools adds</h4>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// memory React DevTools costs you in development</span>\n<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>__DEV__<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// debug info hung off every fiber</span>\n  fiber<span class=\"token punctuation\">.</span>_debugSource <span class=\"token operator\">=</span> element<span class=\"token punctuation\">.</span>_source<span class=\"token punctuation\">;</span>\n  fiber<span class=\"token punctuation\">.</span>_debugOwner <span class=\"token operator\">=</span> element<span class=\"token punctuation\">.</span>_owner<span class=\"token punctuation\">;</span>\n  fiber<span class=\"token punctuation\">.</span>_debugHookTypes <span class=\"token operator\">=</span> hookTypes<span class=\"token punctuation\">;</span>\n\n  <span class=\"token comment\">// and profiling timings</span>\n  fiber<span class=\"token punctuation\">.</span>actualDuration <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n  fiber<span class=\"token punctuation\">.</span>actualStartTime <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n  fiber<span class=\"token punctuation\">.</span>selfBaseDuration <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n  fiber<span class=\"token punctuation\">.</span>treeBaseDuration <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// GC-conscious component</span>\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">MemoryOptimizedComponent</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">React<span class=\"token punctuation\">.</span>Component</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">shouldComponentUpdate</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">nextProps</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// fewer renders, fewer virtual DOM objects</span>\n    <span class=\"token keyword\">return</span> <span class=\"token operator\">!</span><span class=\"token function\">shallowEqual</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>props<span class=\"token punctuation\">,</span> nextProps<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">componentDidMount</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// WeakMap so the cache doesn't pin anything</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>cache <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">WeakMap</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">componentWillUnmount</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// explicit cleanup</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>cache <span class=\"token operator\">=</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>subscription<span class=\"token operator\">?.</span><span class=\"token function\">unsubscribe</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h4 id=\"5-react-18s-concurrent-features\" style=\"position:relative;\"><a href=\"#5-react-18s-concurrent-features\" aria-label=\"5 react 18s concurrent features permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>5. React 18’s concurrent features</h4>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token comment\">// automatic batching</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">handleMultipleUpdates</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// before: each setState triggered its own render</span>\n  <span class=\"token comment\">// now: batched, which means less garbage</span>\n  <span class=\"token function\">setCount</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">c</span> <span class=\"token operator\">=></span> c <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token function\">setFlag</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">f</span> <span class=\"token operator\">=></span> <span class=\"token operator\">!</span>f<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token function\">setItems</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">i</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">[</span><span class=\"token operator\">...</span>i<span class=\"token punctuation\">,</span> newItem<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// Suspense keeps the initial heap smaller</span>\n<span class=\"token keyword\">const</span> LazyComponent <span class=\"token operator\">=</span> React<span class=\"token punctuation\">.</span><span class=\"token function\">lazy</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token keyword\">import</span><span class=\"token punctuation\">(</span><span class=\"token string\">'./HeavyComponent'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// useDeferredValue spreads allocation over time</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">SearchResults</span><span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> query <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> deferredQuery <span class=\"token operator\">=</span> <span class=\"token function\">useDeferredValue</span><span class=\"token punctuation\">(</span>query<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token comment\">// non-urgent updates get deferred,</span>\n  <span class=\"token comment\">// which flattens the Young Generation spike</span>\n  <span class=\"token keyword\">return</span> <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">ExpensiveList</span></span> <span class=\"token attr-name\">query</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>deferredQuery<span class=\"token punctuation\">}</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h4 id=\"6-what-large-apps-actually-do-about-it\" style=\"position:relative;\"><a href=\"#6-what-large-apps-actually-do-about-it\" aria-label=\"6 what large apps actually do about it permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>6. What large apps actually do about it</h4>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// object pooling, as used in Facebook's list virtualization</span>\n<span class=\"token keyword\">const</span> RecyclerListView <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  viewPool<span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n\n  <span class=\"token function\">getView</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>viewPool<span class=\"token punctuation\">.</span><span class=\"token function\">pop</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">||</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">createView</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n\n  <span class=\"token function\">releaseView</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">view</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    view<span class=\"token punctuation\">.</span><span class=\"token function\">reset</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>viewPool<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span>view<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Relay's cache, built to stay collectable</span>\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">RelayCache</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// weak keys, automatic cleanup</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>records <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">WeakMap</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">// TTL so the Old Generation doesn't just grow</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>ttl <span class=\"token operator\">=</span> <span class=\"token number\">5</span> <span class=\"token operator\">*</span> <span class=\"token number\">60</span> <span class=\"token operator\">*</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 5 minutes</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">gc</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> now <span class=\"token operator\">=</span> Date<span class=\"token punctuation\">.</span><span class=\"token function\">now</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>key<span class=\"token punctuation\">,</span> record<span class=\"token punctuation\">]</span> <span class=\"token keyword\">of</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>records<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>now <span class=\"token operator\">-</span> record<span class=\"token punctuation\">.</span>fetchTime <span class=\"token operator\">></span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>ttl<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>records<span class=\"token punctuation\">.</span><span class=\"token function\">delete</span><span class=\"token punctuation\">(</span>key<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>None of this is a standoff. The V8 and React teams have been working on it from both ends for years, and React 18’s concurrent features were designed with V8’s incremental GC in mind. If you want the definitive account of one of these collisions, V8’s own <a href=\"https://v8.dev/blog/react-cliff\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">post on the React performance cliff</a> is worth your time.</p>\n<h2 id=\"from-problem-to-solution-how-the-algorithms-evolved\" style=\"position:relative;\"><a href=\"#from-problem-to-solution-how-the-algorithms-evolved\" aria-label=\"from problem to solution how the algorithms evolved permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>From problem to solution: how the algorithms evolved</h2>\n<p>A generational heap alone doesn’t get you there. The real question is how to collect garbage without stopping the application, and V8’s history is basically a long series of answers to it.</p>\n<h3 id=\"the-starting-point-and-its-ceiling\" style=\"position:relative;\"><a href=\"#the-starting-point-and-its-ceiling\" aria-label=\"the starting point and its ceiling permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>The starting point, and its ceiling</h3>\n<p>In 2008, V8 shipped a semi-space collector built on <strong>Cheney’s algorithm</strong>, the textbook copying collector.</p>\n<div class=\"gatsby-highlight\" data-language=\"cpp\"><pre class=\"language-cpp\"><code class=\"language-cpp\"><span class=\"token comment\">// Cheney's algorithm, in pseudocode</span>\n<span class=\"token keyword\">void</span> <span class=\"token function\">scavenge</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  scan <span class=\"token operator\">=</span> next <span class=\"token operator\">=</span> to_space<span class=\"token punctuation\">.</span>bottom<span class=\"token punctuation\">;</span>\n  <span class=\"token comment\">// 1. scan the roots</span>\n  <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span>root in roots<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token operator\">*</span>root <span class=\"token operator\">=</span> <span class=\"token function\">copy</span><span class=\"token punctuation\">(</span><span class=\"token operator\">*</span>root<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token comment\">// 2. breadth-first from there</span>\n  <span class=\"token keyword\">while</span> <span class=\"token punctuation\">(</span>scan <span class=\"token operator\">&lt;</span> next<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span>slot in <span class=\"token function\">slots_in</span><span class=\"token punctuation\">(</span>scan<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token operator\">*</span>slot <span class=\"token operator\">=</span> <span class=\"token function\">copy</span><span class=\"token punctuation\">(</span><span class=\"token operator\">*</span>slot<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    scan <span class=\"token operator\">+=</span> <span class=\"token function\">object_size</span><span class=\"token punctuation\">(</span>scan<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Simple and fast, with three problems that turn fatal at web-app scale. It wastes 50% of the space by design, since half the semi-space is always empty. Its breadth-first traversal is hostile to cache locality: objects that are used together end up far apart, and you pay for it in L1/L2 misses. And all of it happens on the main thread.</p>\n<h3 id=\"the-turn-tri-color-marking\" style=\"position:relative;\"><a href=\"#the-turn-tri-color-marking\" aria-label=\"the turn tri color marking permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>The turn: tri-color marking</h3>\n<p>V8 moved to <a href=\"https://en.wikipedia.org/wiki/Tracing_garbage_collection#Tri-color_marking\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"><strong>tri-color marking</strong></a>, which is what makes incremental marking possible.</p>\n<div class=\"gatsby-highlight\" data-language=\"cpp\"><pre class=\"language-cpp\"><code class=\"language-cpp\"><span class=\"token comment\">// tri-color invariant</span>\n<span class=\"token keyword\">enum</span> <span class=\"token class-name\">MarkColor</span> <span class=\"token punctuation\">{</span>\n  WHITE <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>  <span class=\"token comment\">// unvisited, collectable</span>\n  GREY <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span>   <span class=\"token comment\">// visited, children not yet processed</span>\n  BLACK <span class=\"token operator\">=</span> <span class=\"token number\">2</span>   <span class=\"token comment\">// fully visited, live</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// the barrier that keeps incremental marking honest</span>\n<span class=\"token keyword\">void</span> <span class=\"token function\">WriteBarrier</span><span class=\"token punctuation\">(</span>HeapObject<span class=\"token operator\">*</span> obj<span class=\"token punctuation\">,</span> Object<span class=\"token operator\">*</span><span class=\"token operator\">*</span> slot<span class=\"token punctuation\">,</span> Object<span class=\"token operator\">*</span> value<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>marking_state <span class=\"token operator\">==</span> INCREMENTAL <span class=\"token operator\">&amp;&amp;</span>\n      <span class=\"token function\">IsBlack</span><span class=\"token punctuation\">(</span>obj<span class=\"token punctuation\">)</span> <span class=\"token operator\">&amp;&amp;</span> <span class=\"token function\">IsWhite</span><span class=\"token punctuation\">(</span>value<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// a black object must never point at a white one</span>\n    <span class=\"token function\">MarkGrey</span><span class=\"token punctuation\">(</span>value<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    marking_worklist<span class=\"token punctuation\">.</span><span class=\"token function\">Push</span><span class=\"token punctuation\">(</span>value<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Now marking can proceed a slice at a time while JavaScript runs in between. Progress, but the marking still happens on the main thread, and that’s the part worth attacking.</p>\n<h2 id=\"the-big-swing-orinoco\" style=\"position:relative;\"><a href=\"#the-big-swing-orinoco\" aria-label=\"the big swing orinoco permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>The big swing: Orinoco</h2>\n<p>Incremental wasn’t enough. Orinoco, started in 2015, was V8’s ground-up rework of the collector under a deliberately aggressive banner: <strong>free the main thread</strong>. Three techniques came out of it.</p>\n<h3 id=\"1-parallel\" style=\"position:relative;\"><a href=\"#1-parallel\" aria-label=\"1 parallel permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>1. Parallel</h3>\n<p>Multiple threads doing GC work at the same time, balanced with <strong>work stealing</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"cpp\"><pre class=\"language-cpp\"><code class=\"language-cpp\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">ParallelMarker</span> <span class=\"token punctuation\">{</span>\n  std<span class=\"token double-colon punctuation\">::</span>atomic<span class=\"token operator\">&lt;</span>Object<span class=\"token operator\">*</span><span class=\"token operator\">></span> marking_worklist<span class=\"token punctuation\">;</span>\n  std<span class=\"token double-colon punctuation\">::</span>atomic<span class=\"token operator\">&lt;</span>size_t<span class=\"token operator\">></span> bytes_marked<span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">void</span> <span class=\"token function\">MarkInParallel</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">while</span> <span class=\"token punctuation\">(</span>Object<span class=\"token operator\">*</span> obj <span class=\"token operator\">=</span> marking_worklist<span class=\"token punctuation\">.</span><span class=\"token function\">pop</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token function\">MarkObject</span><span class=\"token punctuation\">(</span>obj<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token comment\">// when the local queue runs dry, take work from a neighbour</span>\n      <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>local_worklist<span class=\"token punctuation\">.</span><span class=\"token function\">empty</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token function\">StealFromOtherThread</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>On an 8-core machine, parallel marking measured <strong>7.2x</strong> faster than single-threaded. Fast, but the application is still stopped while it happens.</p>\n<h3 id=\"2-incremental\" style=\"position:relative;\"><a href=\"#2-incremental\" aria-label=\"2 incremental permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>2. Incremental</h3>\n<p>Incremental marking chops the work into slices of <strong>5-10ms</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// deciding when to run a step</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">shouldTriggerIncrementalStep</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> allocated <span class=\"token operator\">=</span> <span class=\"token function\">bytesAllocatedSinceLastStep</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">const</span> threshold <span class=\"token operator\">=</span> heap<span class=\"token punctuation\">.</span><span class=\"token function\">size</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">*</span> <span class=\"token number\">0.01</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 1% of heap</span>\n  <span class=\"token keyword\">return</span> allocated <span class=\"token operator\">></span> threshold<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// roughly 1MB of marking per step</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">incrementalMarkingStep</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> deadline <span class=\"token operator\">=</span> performance<span class=\"token punctuation\">.</span><span class=\"token function\">now</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token number\">5</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 5ms budget</span>\n  <span class=\"token keyword\">while</span> <span class=\"token punctuation\">(</span>performance<span class=\"token punctuation\">.</span><span class=\"token function\">now</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">&lt;</span> deadline <span class=\"token operator\">&amp;&amp;</span> <span class=\"token operator\">!</span>marking_worklist<span class=\"token punctuation\">.</span><span class=\"token function\">empty</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">markNextObject</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Internally V8 tracks a marking progress bar so that marking speed keeps pace with allocation speed. Important, but still main-thread work. The real answer was to get off it entirely.</p>\n<h3 id=\"3-concurrent\" style=\"position:relative;\"><a href=\"#3-concurrent\" aria-label=\"3 concurrent permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>3. Concurrent</h3>\n<p>Concurrent marking is the hardest of the three and by far the most effective. V8 uses <strong>snapshot-at-the-beginning (SATB)</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"cpp\"><pre class=\"language-cpp\"><code class=\"language-cpp\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">ConcurrentMarker</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">void</span> <span class=\"token function\">WriteBarrierSATB</span><span class=\"token punctuation\">(</span>HeapObject<span class=\"token operator\">*</span> obj<span class=\"token punctuation\">,</span> Object<span class=\"token operator\">*</span><span class=\"token operator\">*</span> slot<span class=\"token punctuation\">,</span> Object<span class=\"token operator\">*</span> new_value<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    Object<span class=\"token operator\">*</span> old_value <span class=\"token operator\">=</span> <span class=\"token operator\">*</span>slot<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>concurrent_marking_active <span class=\"token operator\">&amp;&amp;</span>\n        <span class=\"token function\">IsWhite</span><span class=\"token punctuation\">(</span>old_value<span class=\"token punctuation\">)</span> <span class=\"token operator\">&amp;&amp;</span> <span class=\"token operator\">!</span><span class=\"token function\">IsWhite</span><span class=\"token punctuation\">(</span>new_value<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token comment\">// preserve the old reference for the snapshot</span>\n      satb_buffer<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span>old_value<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token operator\">*</span>slot <span class=\"token operator\">=</span> new_value<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">void</span> <span class=\"token function\">ConcurrentMarkingTask</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// running on a helper thread</span>\n    <span class=\"token keyword\">while</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>marking_worklist<span class=\"token punctuation\">.</span><span class=\"token function\">empty</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      Object<span class=\"token operator\">*</span> obj <span class=\"token operator\">=</span> marking_worklist<span class=\"token punctuation\">.</span><span class=\"token function\">pop</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token comment\">// lock-free marking via CAS</span>\n      <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token function\">TryMarkBlack</span><span class=\"token punctuation\">(</span>obj<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token function\">VisitPointers</span><span class=\"token punctuation\">(</span>obj<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Concurrent marking cut Major GC pause times by <strong>60-70%</strong>.</p>\n<h2 id=\"v8-today-the-three-techniques-together\" style=\"position:relative;\"><a href=\"#v8-today-the-three-techniques-together\" aria-label=\"v8 today the three techniques together permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>V8 today: the three techniques together</h2>\n<p>Those three ideas are now the core of the collector. Here’s how each phase uses them.</p>\n<h3 id=\"young-generation-parallel-scavenging\" style=\"position:relative;\"><a href=\"#young-generation-parallel-scavenging\" aria-label=\"young generation parallel scavenging permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Young Generation: parallel scavenging</h3>\n<p>Young GC is <strong>fully parallel</strong>. The main thread does stop, but only briefly, while several helper threads work at once.</p>\n<div class=\"gatsby-highlight\" data-language=\"cpp\"><pre class=\"language-cpp\"><code class=\"language-cpp\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">ParallelScavenger</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">void</span> <span class=\"token function\">Scavenge</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// 1. scan roots in parallel</span>\n    <span class=\"token function\">parallel_for</span><span class=\"token punctuation\">(</span>roots<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">(</span>Root<span class=\"token operator\">*</span> root<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token function\">EvacuateObject</span><span class=\"token punctuation\">(</span>root<span class=\"token operator\">-></span>object<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">// 2. work stealing keeps threads busy</span>\n    <span class=\"token keyword\">while</span> <span class=\"token punctuation\">(</span><span class=\"token function\">has_work</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">||</span> <span class=\"token function\">can_steal_work</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      Object<span class=\"token operator\">*</span> obj <span class=\"token operator\">=</span> <span class=\"token function\">get_next_object</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token function\">CopyToSurvivor</span><span class=\"token punctuation\">(</span>obj<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token comment\">// 3. pointer updates go parallel too</span>\n    <span class=\"token function\">parallel_update_pointers</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>On an 8-core machine that took Young GC from 50ms down to 7ms.</p>\n<h3 id=\"old-generation-as-concurrent-as-possible\" style=\"position:relative;\"><a href=\"#old-generation-as-concurrent-as-possible\" aria-label=\"old generation as concurrent as possible permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Old Generation: as concurrent as possible</h3>\n<p>Old GC leans on concurrency wherever it can:</p>\n<ol>\n<li><strong>Concurrent marking</strong> starts in the background while JavaScript keeps running</li>\n<li><strong>Incremental marking</strong>: the main thread pitches in with 5ms slices</li>\n<li><strong>Finalization</strong>: a short pause to finish marking (2-3ms)</li>\n<li><strong>Concurrent sweeping</strong>: reclaiming memory, back in the background</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// what the timeline looks like</span>\n<span class=\"token punctuation\">[</span><span class=\"token constant\">JS</span> running<span class=\"token punctuation\">]</span><span class=\"token operator\">--</span><span class=\"token operator\">></span><span class=\"token punctuation\">[</span>concurrent marking starts<span class=\"token punctuation\">]</span><span class=\"token operator\">--</span><span class=\"token operator\">></span><span class=\"token punctuation\">[</span><span class=\"token constant\">JS</span><span class=\"token punctuation\">]</span><span class=\"token operator\">--</span><span class=\"token operator\">></span><span class=\"token punctuation\">[</span><span class=\"token number\">5</span>ms step<span class=\"token punctuation\">]</span><span class=\"token operator\">--</span><span class=\"token operator\">></span><span class=\"token punctuation\">[</span><span class=\"token constant\">JS</span><span class=\"token punctuation\">]</span><span class=\"token operator\">--</span><span class=\"token operator\">></span><span class=\"token punctuation\">[</span><span class=\"token number\">2</span>ms finalize<span class=\"token punctuation\">]</span><span class=\"token operator\">--</span><span class=\"token operator\">></span><span class=\"token punctuation\">[</span><span class=\"token constant\">JS</span><span class=\"token punctuation\">]</span>\n      ↑                    ↑                          ↑              ↑\nallocation limit    background work           cooperative      minimal pause</code></pre></div>\n<h3 id=\"idle-time-gc\" style=\"position:relative;\"><a href=\"#idle-time-gc\" aria-label=\"idle time gc permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Idle-time GC</h3>\n<p>Chrome’s idle periods are a resource, and V8 spends them:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// hooked into requestIdleCallback</span>\n<span class=\"token function\">requestIdleCallback</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">deadline</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> timeRemaining <span class=\"token operator\">=</span> deadline<span class=\"token punctuation\">.</span><span class=\"token function\">timeRemaining</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>timeRemaining <span class=\"token operator\">></span> <span class=\"token number\">10</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// enough room for a major collection</span>\n    <span class=\"token function\">triggerMajorGC</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>timeRemaining <span class=\"token operator\">></span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// just enough for a minor one</span>\n    <span class=\"token function\">triggerMinorGC</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>The combination is why you can hold 60FPS and still have the heap under control. The collector does most of its work in the gaps.</p>\n<h2 id=\"a-closer-look-at-the-implementations\" style=\"position:relative;\"><a href=\"#a-closer-look-at-the-implementations\" aria-label=\"a closer look at the implementations permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>A closer look at the implementations</h2>\n<h3 id=\"concurrent-marking-in-detail\" style=\"position:relative;\"><a href=\"#concurrent-marking-in-detail\" aria-label=\"concurrent marking in detail permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Concurrent marking, in detail</h3>\n<p>Everything in concurrent marking exists to preserve the <strong>tri-color invariant</strong> while the mutator keeps changing the graph underneath it.</p>\n<div class=\"gatsby-highlight\" data-language=\"cpp\"><pre class=\"language-cpp\"><code class=\"language-cpp\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">ConcurrentMarkingVisitor</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">void</span> <span class=\"token function\">VisitPointers</span><span class=\"token punctuation\">(</span>HeapObject<span class=\"token operator\">*</span> host<span class=\"token punctuation\">,</span> ObjectSlot start<span class=\"token punctuation\">,</span> ObjectSlot end<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span>ObjectSlot slot <span class=\"token operator\">=</span> start<span class=\"token punctuation\">;</span> slot <span class=\"token operator\">&lt;</span> end<span class=\"token punctuation\">;</span> <span class=\"token operator\">++</span>slot<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      Object<span class=\"token operator\">*</span> target <span class=\"token operator\">=</span> <span class=\"token operator\">*</span>slot<span class=\"token punctuation\">;</span>\n\n      <span class=\"token comment\">// 1. already handled</span>\n      <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token function\">IsBlackOrGrey</span><span class=\"token punctuation\">(</span>target<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">continue</span><span class=\"token punctuation\">;</span>\n\n      <span class=\"token comment\">// 2. CAS, because other threads are doing the same thing</span>\n      <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token function\">CompareAndSwapColor</span><span class=\"token punctuation\">(</span>target<span class=\"token punctuation\">,</span> WHITE<span class=\"token punctuation\">,</span> GREY<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token comment\">// 3. push onto a lock-free worklist</span>\n        marking_worklist_<span class=\"token punctuation\">.</span><span class=\"token function\">Push</span><span class=\"token punctuation\">(</span>target<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token comment\">// 4. and record the cross-generation reference</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>host<span class=\"token operator\">-></span><span class=\"token function\">IsInOldSpace</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n          remembered_set_<span class=\"token punctuation\">.</span><span class=\"token function\">Insert</span><span class=\"token punctuation\">(</span>slot<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h3 id=\"how-the-parallel-scavenger-splits-work\" style=\"position:relative;\"><a href=\"#how-the-parallel-scavenger-splits-work\" aria-label=\"how the parallel scavenger splits work permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>How the parallel scavenger splits work</h3>\n<p>Via <a href=\"https://en.wikipedia.org/wiki/Work_stealing\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"><strong>dynamic work stealing</strong></a>:</p>\n<div class=\"gatsby-highlight\" data-language=\"cpp\"><pre class=\"language-cpp\"><code class=\"language-cpp\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">WorkStealingQueue</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">bool</span> <span class=\"token function\">TrySteal</span><span class=\"token punctuation\">(</span>Object<span class=\"token operator\">*</span><span class=\"token operator\">*</span> obj<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// 1. local queue first</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>local_queue_<span class=\"token punctuation\">.</span><span class=\"token function\">Pop</span><span class=\"token punctuation\">(</span>obj<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">return</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">// 2. empty? steal from someone else</span>\n    <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> i <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;</span> num_threads<span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>global_queues_<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span><span class=\"token function\">TryStealHalf</span><span class=\"token punctuation\">(</span><span class=\"token operator\">&amp;</span>local_queue_<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> local_queue_<span class=\"token punctuation\">.</span><span class=\"token function\">Pop</span><span class=\"token punctuation\">(</span>obj<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token comment\">// 3. everyone's empty, so we're done</span>\n    <span class=\"token keyword\">return</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>The object graph is wildly uneven. One thread can draw a subtree with a hundred thousand nodes while another gets three, so static partitioning would leave most cores idle. Stealing is what turns extra cores into actual speed.</p>\n<h2 id=\"the-other-axis-the-compiler\" style=\"position:relative;\"><a href=\"#the-other-axis-the-compiler\" aria-label=\"the other axis the compiler permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>The other axis: the compiler</h2>\n<p>Memory is half the story. The other half is how JavaScript gets turned into machine code, and V8’s compiler pipeline has been rebuilt just as thoroughly as its collector.</p>\n<h3 id=\"generation-1-full-codegen--crankshaft-2010-2016\" style=\"position:relative;\"><a href=\"#generation-1-full-codegen--crankshaft-2010-2016\" aria-label=\"generation 1 full codegen  crankshaft 2010 2016 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Generation 1: Full-codegen + Crankshaft (2010-2016)</h3>\n<p>Two compilers, one fast and one good.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// the kind of function that gets optimized</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">calculateSum</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">arr</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">let</span> sum <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">let</span> i <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;</span> arr<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    sum <span class=\"token operator\">+=</span> arr<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>  <span class=\"token comment\">// hot loop, Crankshaft's territory</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token keyword\">return</span> sum<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// Full-codegen: compiles fast, runs slow</span>\n<span class=\"token comment\">// -> every function goes straight to native code</span>\n\n<span class=\"token comment\">// Crankshaft: compiles slow, runs fast</span>\n<span class=\"token comment\">// -> only hot functions get this treatment</span></code></pre></div>\n<p>It worked, and then it stopped scaling. Compiling everything to native code costs a lot of memory. Deoptimization happened constantly. And Crankshaft simply couldn’t handle a lot of the JavaScript people were actually writing: try/catch, generators, <code class=\"language-text\">let</code>/<code class=\"language-text\">const</code> in some positions.</p>\n<h3 id=\"generation-2-ignition--turbofan-2016-present\" style=\"position:relative;\"><a href=\"#generation-2-ignition--turbofan-2016-present\" aria-label=\"generation 2 ignition  turbofan 2016 present permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Generation 2: Ignition + TurboFan (2016-present)</h3>\n<p>In 2016 the team replaced the whole pipeline. <strong>Ignition</strong> is an interpreter that compiles JavaScript to compact bytecode, cutting memory use by 50-75% versus Full-codegen. <strong>TurboFan</strong> replaced Crankshaft as the optimizing compiler and does considerably more sophisticated work.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// the path a function takes</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">Component</span><span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> data <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// 1. parse -> AST</span>\n  <span class=\"token comment\">// 2. Ignition lowers it to bytecode</span>\n  <span class=\"token keyword\">const</span> result <span class=\"token operator\">=</span> data<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">item</span> <span class=\"token operator\">=></span> item <span class=\"token operator\">*</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token comment\">// 3. execution counts and type info accumulate (feedback vector)</span>\n  <span class=\"token comment\">// 4. hot enough, and TurboFan takes over</span>\n  <span class=\"token keyword\">return</span> result<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// roughly what the bytecode looks like</span>\n<span class=\"token comment\">/*\n  LdaNamedProperty a0, [0]    // load data\n  CallProperty1 [1], a0, a1   // call map\n  Return\n*/</span></code></pre></div>\n<p>The wins compound. Bytecode is much smaller than native code, which matters enormously on mobile. It’s generated fast, so startup improves. And optimization becomes something you spend only where it pays.</p>\n<h3 id=\"inline-caching-and-hidden-classes\" style=\"position:relative;\"><a href=\"#inline-caching-and-hidden-classes\" aria-label=\"inline caching and hidden classes permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Inline caching and Hidden Classes</h3>\n<p><strong>Inline caching</strong> attacks the single biggest tax on a dynamic language: property access. Every <code class=\"language-text\">obj.property</code> in principle requires checking the object’s shape and then finding the property. An IC remembers what it saw last time at that call site and skips the lookup when the shape matches.</p>\n<p><strong>Hidden Classes</strong> are what it matches against, the internal metadata describing an object’s shape. Objects with the same properties added in the same order share one, and that sharing is what gets property access down to something close to a C++ struct field load.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// how transitions happen</span>\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">Point</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">x<span class=\"token punctuation\">,</span> y</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>x <span class=\"token operator\">=</span> x<span class=\"token punctuation\">;</span>  <span class=\"token comment\">// Hidden Class C0 -> C1</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>y <span class=\"token operator\">=</span> y<span class=\"token punctuation\">;</span>  <span class=\"token comment\">// Hidden Class C1 -> C2</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// monomorphic: one shape, fully optimizable</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">getX</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">point</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> point<span class=\"token punctuation\">.</span>x<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// polymorphic: many shapes, much harder</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">getValue</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">obj</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> obj<span class=\"token punctuation\">.</span>value<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// in a component</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">UserProfile</span><span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> user <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// consistent props shape means the IC stays hot</span>\n  <span class=\"token keyword\">return</span> <span class=\"token operator\">&lt;</span>div<span class=\"token operator\">></span><span class=\"token punctuation\">{</span>user<span class=\"token punctuation\">.</span>name<span class=\"token punctuation\">}</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// and the anti-pattern</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">BadComponent</span><span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> data <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>someCondition<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    data<span class=\"token punctuation\">.</span>extraField <span class=\"token operator\">=</span> <span class=\"token string\">'value'</span><span class=\"token punctuation\">;</span>  <span class=\"token comment\">// shape change, cache blown</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token keyword\">return</span> <span class=\"token operator\">&lt;</span>div<span class=\"token operator\">></span><span class=\"token punctuation\">{</span>data<span class=\"token punctuation\">.</span>value<span class=\"token punctuation\">}</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"the-optimization-feedback-loop\" style=\"position:relative;\"><a href=\"#the-optimization-feedback-loop\" aria-label=\"the optimization feedback loop permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>The optimization feedback loop</h3>\n<p>V8’s adaptive optimization decides what to compile based on what actually runs, in three stages:</p>\n<ol>\n<li><strong>Cold</strong>: first execution, interpreted by Ignition</li>\n<li><strong>Warm</strong>: called repeatedly, collecting type feedback along the way</li>\n<li><strong>Hot</strong>: past a threshold (typically 1,000-10,000 calls), TurboFan compiles it</li>\n</ol>\n<p>The point of the loop is that optimization follows real usage instead of a guess, so you don’t spend compile time on code nobody calls twice.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// the three tiers, side by side</span>\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">OptimizationExample</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// cold: interpreted, and that's fine</span>\n  <span class=\"token function\">rarely_called</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> Math<span class=\"token punctuation\">.</span><span class=\"token function\">random</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token comment\">// warm: type feedback accumulating</span>\n  <span class=\"token function\">sometimes_called</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">x<span class=\"token punctuation\">,</span> y</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> x <span class=\"token operator\">+</span> y<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token comment\">// hot: TurboFan compiles this</span>\n  <span class=\"token function\">frequently_called</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">arr</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">let</span> sum <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">let</span> i <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;</span> arr<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      sum <span class=\"token operator\">+=</span> arr<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">return</span> sum<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// what gets recorded per call site</span>\n<span class=\"token keyword\">let</span> feedback <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  callCount<span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n  parameterTypes<span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n  returnTypes<span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// render functions are called constantly, so they optimize well</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">FrequentlyRendered</span><span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> items <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> items<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">item<span class=\"token punctuation\">,</span> i</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">(</span>\n    <span class=\"token operator\">&lt;</span>Item key<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>i<span class=\"token punctuation\">}</span> data<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>item<span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"what-turbofan-actually-does\" style=\"position:relative;\"><a href=\"#what-turbofan-actually-does\" aria-label=\"what turbofan actually does permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>What TurboFan actually does</h3>\n<p>TurboFan isn’t a simple JIT. It builds a Sea of Nodes intermediate representation and runs real optimization passes over it.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// 1. inlining</span>\n<span class=\"token comment\">// removes call overhead, typically 10-30%</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">a<span class=\"token punctuation\">,</span> b</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token keyword\">return</span> a <span class=\"token operator\">+</span> b<span class=\"token punctuation\">;</span> <span class=\"token punctuation\">}</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">calculate</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">x<span class=\"token punctuation\">,</span> y</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token function\">add</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">)</span> <span class=\"token operator\">*</span> <span class=\"token number\">2</span><span class=\"token punctuation\">;</span>\n  <span class=\"token comment\">// after inlining: return (x + y) * 2;</span>\n  <span class=\"token comment\">// and now further optimizations become visible</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// 2. escape analysis</span>\n<span class=\"token comment\">// an object that never leaves the function never needs the heap</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">createPoint</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> point <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span> x<span class=\"token operator\">:</span> <span class=\"token number\">10</span><span class=\"token punctuation\">,</span> y<span class=\"token operator\">:</span> <span class=\"token number\">20</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>  <span class=\"token comment\">// would normally be heap-allocated</span>\n  <span class=\"token keyword\">return</span> point<span class=\"token punctuation\">.</span>x <span class=\"token operator\">+</span> point<span class=\"token punctuation\">.</span>y<span class=\"token punctuation\">;</span>        <span class=\"token comment\">// but it never escapes</span>\n  <span class=\"token comment\">// after optimization: return 30;</span>\n  <span class=\"token comment\">// no allocation, nothing for the collector to do</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// 3. loop optimizations</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">processArray</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">arr</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// unrolling: fewer iterations, fewer branch mispredictions</span>\n  <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">let</span> i <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;</span> arr<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">;</span> i <span class=\"token operator\">+=</span> <span class=\"token number\">4</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    arr<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> arr<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span> <span class=\"token operator\">*</span> <span class=\"token number\">2</span><span class=\"token punctuation\">;</span>\n    arr<span class=\"token punctuation\">[</span>i<span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> arr<span class=\"token punctuation\">[</span>i<span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">*</span> <span class=\"token number\">2</span><span class=\"token punctuation\">;</span>\n    arr<span class=\"token punctuation\">[</span>i<span class=\"token operator\">+</span><span class=\"token number\">2</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> arr<span class=\"token punctuation\">[</span>i<span class=\"token operator\">+</span><span class=\"token number\">2</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">*</span> <span class=\"token number\">2</span><span class=\"token punctuation\">;</span>\n    arr<span class=\"token punctuation\">[</span>i<span class=\"token operator\">+</span><span class=\"token number\">3</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> arr<span class=\"token punctuation\">[</span>i<span class=\"token operator\">+</span><span class=\"token number\">3</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">*</span> <span class=\"token number\">2</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token comment\">// up to 4x on the right workload, thanks to pipeline utilization</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// 4. and how React benefits</span>\n<span class=\"token keyword\">const</span> MemoizedComponent <span class=\"token operator\">=</span> React<span class=\"token punctuation\">.</span><span class=\"token function\">memo</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> data <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// the props comparison itself gets optimized</span>\n  <span class=\"token keyword\">return</span> <span class=\"token operator\">&lt;</span>ExpensiveRender data<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>data<span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h3 id=\"watching-it-happen\" style=\"position:relative;\"><a href=\"#watching-it-happen\" aria-label=\"watching it happen permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Watching it happen</h3>\n<p>You don’t have to take any of this on faith. Chrome DevTools’ Performance panel shows it, and Node’s <code class=\"language-text\">--trace-opt</code> flag shows it in more detail.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// crude but effective</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">profileFunction</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// 1. first run: interpreted</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">time</span><span class=\"token punctuation\">(</span><span class=\"token string\">'cold'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token function\">calculateSum</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span><span class=\"token number\">3</span><span class=\"token punctuation\">,</span><span class=\"token number\">4</span><span class=\"token punctuation\">,</span><span class=\"token number\">5</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">timeEnd</span><span class=\"token punctuation\">(</span><span class=\"token string\">'cold'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token comment\">// 2. warm it up</span>\n  <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">let</span> i <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">calculateSum</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span><span class=\"token number\">3</span><span class=\"token punctuation\">,</span><span class=\"token number\">4</span><span class=\"token punctuation\">,</span><span class=\"token number\">5</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token comment\">// 3. now it's compiled</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">time</span><span class=\"token punctuation\">(</span><span class=\"token string\">'hot'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token function\">calculateSum</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span><span class=\"token number\">3</span><span class=\"token punctuation\">,</span><span class=\"token number\">4</span><span class=\"token punctuation\">,</span><span class=\"token number\">5</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">timeEnd</span><span class=\"token punctuation\">(</span><span class=\"token string\">'hot'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  <span class=\"token comment\">// noticeably faster</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// or watch the decisions directly</span>\n<span class=\"token comment\">// node --trace-opt --trace-deopt script.js</span></code></pre></div>\n<h3 id=\"where-react-and-v8-line-up\" style=\"position:relative;\"><a href=\"#where-react-and-v8-line-up\" aria-label=\"where react and v8 line up permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Where React and V8 line up</h3>\n<p>React was written by people who knew what V8 rewards, and React 18’s concurrent features fit the engine’s optimization model closely.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// compiler-friendly by construction</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">OptimizedComponent</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// 1. stable types</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>count<span class=\"token punctuation\">,</span> setCount<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">useState</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  <span class=\"token comment\">// always a number</span>\n\n  <span class=\"token comment\">// 2. predictable structure</span>\n  <span class=\"token keyword\">const</span> content <span class=\"token operator\">=</span> <span class=\"token function\">useMemo</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> count <span class=\"token operator\">></span> <span class=\"token number\">10</span> <span class=\"token operator\">?</span> <span class=\"token operator\">&lt;</span>Heavy <span class=\"token operator\">/</span><span class=\"token operator\">></span> <span class=\"token operator\">:</span> <span class=\"token operator\">&lt;</span>Light <span class=\"token operator\">/</span><span class=\"token operator\">></span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span>count<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token comment\">// 3. stable function identity</span>\n  <span class=\"token keyword\">const</span> handleClick <span class=\"token operator\">=</span> <span class=\"token function\">useCallback</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">e</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// same reference every render, so the IC stays monomorphic</span>\n    <span class=\"token function\">setCount</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">c</span> <span class=\"token operator\">=></span> c <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token operator\">&lt;</span>div onClick<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>handleClick<span class=\"token punctuation\">}</span><span class=\"token operator\">></span><span class=\"token punctuation\">{</span>content<span class=\"token punctuation\">}</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// React Compiler (experimental) pushes this further,</span>\n<span class=\"token comment\">// doing at build time what would otherwise be runtime work</span></code></pre></div>\n<h3 id=\"anti-patterns-worth-avoiding\" style=\"position:relative;\"><a href=\"#anti-patterns-worth-avoiding\" aria-label=\"anti patterns worth avoiding permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Anti-patterns worth avoiding</h3>\n<p>A handful of common patterns actively fight the optimizer. Fixing them is often worth 2-10x.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// anti-pattern 1: churning the Hidden Class</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">bad</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> obj <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n  obj<span class=\"token punctuation\">.</span>a <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span>      <span class=\"token comment\">// HC1</span>\n  obj<span class=\"token punctuation\">.</span>b <span class=\"token operator\">=</span> <span class=\"token number\">2</span><span class=\"token punctuation\">;</span>      <span class=\"token comment\">// HC2</span>\n  <span class=\"token keyword\">delete</span> obj<span class=\"token punctuation\">.</span>a<span class=\"token punctuation\">;</span>   <span class=\"token comment\">// HC3, and now you're deoptimized</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// fix: declare the shape up front</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">good</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> obj <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span> a<span class=\"token operator\">:</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> b<span class=\"token operator\">:</span> <span class=\"token number\">2</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>needToRemove<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    obj<span class=\"token punctuation\">.</span>a <span class=\"token operator\">=</span> <span class=\"token keyword\">undefined</span><span class=\"token punctuation\">;</span>  <span class=\"token comment\">// undefined instead of delete</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// anti-pattern 2: too many shapes at one call site</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">processItems</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">items</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  items<span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">item</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// item is a different shape every time, so nothing to cache</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>item<span class=\"token punctuation\">.</span>value<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// fix: one shape</span>\n<span class=\"token keyword\">interface</span> <span class=\"token class-name\">Item</span> <span class=\"token punctuation\">{</span>\n  value<span class=\"token operator\">:</span> number<span class=\"token punctuation\">;</span>\n  type<span class=\"token operator\">:</span> string<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">processTypedItems</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">items<span class=\"token operator\">:</span> Item<span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span></span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  items<span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">item</span> <span class=\"token operator\">=></span> console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>item<span class=\"token punctuation\">.</span>value<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Compilers made JavaScript fast, and frameworks like React quietly do the work of staying on the fast path so you mostly don’t have to think about it. But none of it survives careless memory use, which brings us back to the heap.</p>\n<h2 id=\"supporting-techniques\" style=\"position:relative;\"><a href=\"#supporting-techniques\" aria-label=\"supporting techniques permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Supporting techniques</h2>\n<p>Around the core collector sits a set of smaller optimizations. Each one only matters in particular situations, but where they apply they matter a lot.</p>\n<h3 id=\"1-object-pooling\" style=\"position:relative;\"><a href=\"#1-object-pooling\" aria-label=\"1 object pooling permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>1. Object pooling</h3>\n<p>Pooling means creating objects once and reusing them instead of allocating and discarding. It pays off in exactly the places you’d expect: games, animation, anything that produces hundreds of objects per frame.</p>\n<p>Instead of letting an object die, you hand it back to a pool and take it out again when you need one. Young Generation pressure drops, and so does collection frequency.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// a pool, minus the details</span>\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">ObjectPool</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">createFn<span class=\"token punctuation\">,</span> maxSize <span class=\"token operator\">=</span> <span class=\"token number\">100</span></span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>createFn <span class=\"token operator\">=</span> createFn<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>pool <span class=\"token operator\">=</span> <span class=\"token function\">Array</span><span class=\"token punctuation\">(</span>maxSize<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">fill</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">null</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span>createFn<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">acquire</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>pool<span class=\"token punctuation\">.</span><span class=\"token function\">pop</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">||</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">createFn</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">release</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">obj</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>pool<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span>obj<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// bullets in a game, for instance</span>\n<span class=\"token keyword\">const</span> bulletPool <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">ObjectPool</span><span class=\"token punctuation\">(</span>\n  <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> x<span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> y<span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> active<span class=\"token operator\">:</span> <span class=\"token boolean\">false</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n  <span class=\"token number\">1000</span>\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Measured on a particle system, pooling cut GC pauses by 70% and effectively eliminated dropped frames. The gap was widest on mobile, where there’s less headroom to hide a pause in.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// the difference, concretely</span>\n<span class=\"token keyword\">const</span> particles <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">let</span> i <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;</span> <span class=\"token number\">10000</span><span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// without pooling: a new object every iteration</span>\n  particles<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> x<span class=\"token operator\">:</span> Math<span class=\"token punctuation\">.</span><span class=\"token function\">random</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">*</span> <span class=\"token number\">800</span><span class=\"token punctuation\">,</span> y<span class=\"token operator\">:</span> <span class=\"token number\">600</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token comment\">// with pooling: reuse</span>\n  <span class=\"token comment\">// const p = pool.acquire();</span>\n  <span class=\"token comment\">// p.x = Math.random() * 800;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Worth saying: pooling is not free. You’re taking manual responsibility for object lifetimes in a language that was designed to take that away from you, and a pooled object that keeps a stale reference is a leak the collector can’t help you with. Reach for it when you’ve measured a problem, not by default.</p>\n<h3 id=\"2-compaction\" style=\"position:relative;\"><a href=\"#2-compaction\" aria-label=\"2 compaction permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>2. Compaction</h3>\n<p>Fragmentation is the chronic disease of long-running applications. Allocate and free objects of varying sizes for long enough and the heap fills with holes too small to use. You have plenty of free memory and still can’t satisfy a large allocation.</p>\n<p>V8’s answer is to move live objects together during Major GC, consolidating the free space behind them. It’s expensive, which is why V8 prefers to do it during idle time.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// how fragmentation gets made</span>\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">FragmentationExample</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>data <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">// mix large and small objects, free some of each,</span>\n    <span class=\"token comment\">// and the free space ends up scattered</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// what you can do about it from the outside</span>\n<span class=\"token keyword\">const</span> optimized <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  smallObjects<span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>     <span class=\"token comment\">// group by size</span>\n  largeObjects<span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n  buffer<span class=\"token operator\">:</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">ArrayBuffer</span><span class=\"token punctuation\">(</span><span class=\"token number\">1024</span> <span class=\"token operator\">*</span> <span class=\"token number\">1024</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token comment\">// or take contiguous memory yourself</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h3 id=\"3-pointer-compression\" style=\"position:relative;\"><a href=\"#3-pointer-compression\" aria-label=\"3 pointer compression permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>3. Pointer compression</h3>\n<p>Shipped in <strong>Chrome 80</strong>, and one of the largest single memory wins V8 has had. On a 64-bit machine every pointer costs 8 bytes, which for a language that allocates as many small objects as JavaScript is a lot of overhead for very little addressing range that anyone uses.</p>\n<p>The trick: confine JavaScript objects to a 4GB “cage” and store addresses within it as 32-bit offsets. Real addresses are reconstructed as base + offset.</p>\n<p>Chrome measured an average <strong>43%</strong> reduction in V8 heap usage on typical pages. React apps benefit disproportionately, because a component tree is mostly pointers.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// pointer compression (Chrome 80+)</span>\n<span class=\"token comment\">// before: 8 bytes per reference (64-bit)</span>\n<span class=\"token comment\">// after:  4 bytes per reference (32-bit offset)</span>\n\n<span class=\"token keyword\">const</span> obj <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  ref1<span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>  <span class=\"token comment\">// 8 bytes -> 4 bytes</span>\n  ref2<span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  ref3<span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h3 id=\"4-string-interning\" style=\"position:relative;\"><a href=\"#4-string-interning\" aria-label=\"4 string interning permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>4. String interning</h3>\n<p>Interning stores one copy of a given string instead of many, the same idea as Java’s string pool, except V8 does it for you.</p>\n<p>Short strings and frequently used ones get interned automatically. Event type strings like <code class=\"language-text\">\"click\"</code> and <code class=\"language-text\">\"hover\"</code> exist once in memory no matter how many thousands of times they appear.</p>\n<p>You can help by reusing string constants rather than constructing equivalent strings at runtime. Redux action types and event names are the usual candidates.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> <span class=\"token constant\">EVENT_TYPES</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token constant\">CLICK</span><span class=\"token operator\">:</span> <span class=\"token string\">'click'</span><span class=\"token punctuation\">,</span>\n  <span class=\"token constant\">HOVER</span><span class=\"token operator\">:</span> <span class=\"token string\">'hover'</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// used 10,000 times, stored once</span>\nevents<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> type<span class=\"token operator\">:</span> <span class=\"token constant\">EVENT_TYPES</span><span class=\"token punctuation\">.</span><span class=\"token constant\">CLICK</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h3 id=\"5-weakmap-and-weakset\" style=\"position:relative;\"><a href=\"#5-weakmap-and-weakset\" aria-label=\"5 weakmap and weakset permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>5. WeakMap and WeakSet</h3>\n<p>The weak collections from ES6 are the most direct tool JavaScript gives you for preventing leaks.</p>\n<p>A regular <code class=\"language-text\">Map</code> holds its keys strongly. Put a DOM node in one and that node cannot be collected until you remove the entry by hand, and that “by hand” is where leaks come from, because the removal is easy to forget and impossible to notice.</p>\n<p>A <code class=\"language-text\">WeakMap</code> holds its keys weakly. When nothing else references the key, the entry disappears on its own. That makes it the right structure for caches, metadata attached to DOM nodes, and private per-instance data.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// WeakMap: cleans itself up</span>\n<span class=\"token keyword\">const</span> cache <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">WeakMap</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\nelements<span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">el</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  cache<span class=\"token punctuation\">.</span><span class=\"token function\">set</span><span class=\"token punctuation\">(</span>el<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> data<span class=\"token operator\">:</span> <span class=\"token string\">'metadata'</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token comment\">// remove el from the document and the cache entry goes with it</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Map: your responsibility, and a leak if you forget</span>\n<span class=\"token keyword\">const</span> map <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Map</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>These techniques aren’t a checklist to apply all at once. You pick the one that fits the problem. Games and real-time apps get the most out of them.</p>\n<h2 id=\"what-orinoco-actually-bought\" style=\"position:relative;\"><a href=\"#what-orinoco-actually-bought\" aria-label=\"what orinoco actually bought permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>What Orinoco actually bought</h2>\n<p>Numbers, before and after:</p>\n<ul>\n<li>Before Orinoco (2016): GC pauses of 10-50ms</li>\n<li>After Orinoco (2019): GC pauses of 2-15ms, a 40-60% reduction</li>\n</ul>\n<p>In SPA workloads, average interaction latency improved roughly 18% after Orinoco landed.</p>\n<p>Impressive, and then a different kind of workload showed up.</p>\n<h2 id=\"webassembly-and-how-v8-runs-it\" style=\"position:relative;\"><a href=\"#webassembly-and-how-v8-runs-it\" aria-label=\"webassembly and how v8 runs it permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>WebAssembly and how V8 runs it</h2>\n<p>WebAssembly is a low-level binary format built to run at near-native speed in a browser. It’s how C++, Rust and Go code ends up on a web page, and V8 has an entire optimization strategy dedicated to executing it well.</p>\n<h3 id=\"1-tiered-compilation\" style=\"position:relative;\"><a href=\"#1-tiered-compilation\" aria-label=\"1 tiered compilation permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>1. Tiered compilation</h3>\n<p>WASM modules can be several megabytes. Compile them thoroughly and startup is terrible; compile them carelessly and you’ve given up the performance you came for.</p>\n<p>V8 does what it does for JavaScript: two tiers. <strong>Liftoff</strong>, a baseline compiler, gets you executing quickly, while <strong>TurboFan</strong> produces optimized code in the background.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// tiered compilation, from the outside</span>\n<span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token function\">loadWasm</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> response <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span><span class=\"token string\">'module.wasm'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token comment\">// streaming: compile while it downloads</span>\n  <span class=\"token keyword\">const</span> module <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> WebAssembly<span class=\"token punctuation\">.</span><span class=\"token function\">compileStreaming</span><span class=\"token punctuation\">(</span>response<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token comment\">// Liftoff: ~10ms/MB (baseline, fast)</span>\n  <span class=\"token comment\">// TurboFan: ~100ms/function (optimized, background)</span>\n\n  <span class=\"token keyword\">return</span> WebAssembly<span class=\"token punctuation\">.</span><span class=\"token function\">instantiate</span><span class=\"token punctuation\">(</span>module<span class=\"token punctuation\">,</span> imports<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"2-dynamic-tiering\" style=\"position:relative;\"><a href=\"#2-dynamic-tiering\" aria-label=\"2 dynamic tiering permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>2. Dynamic tiering</h3>\n<p><strong>Chrome 96</strong> added dynamic tiering, which decides what to re-compile based on how often each function actually runs. On mobile this matters for battery as much as for speed, since optimizing code nobody calls is pure waste.</p>\n<p>The mechanism is straightforward: everything starts on Liftoff, execution counters identify the hot functions, anything past the threshold (roughly 1,000 calls) gets recompiled by TurboFan, and the threshold itself adapts to the workload.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// conceptually</span>\n<span class=\"token keyword\">const</span> funcStats <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  add<span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> calls<span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> optimized<span class=\"token operator\">:</span> <span class=\"token boolean\">false</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  matrixMultiply<span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> calls<span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> optimized<span class=\"token operator\">:</span> <span class=\"token boolean\">false</span> <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// past the threshold, recompile</span>\n<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>funcStats<span class=\"token punctuation\">.</span>matrixMultiply<span class=\"token punctuation\">.</span>calls<span class=\"token operator\">++</span> <span class=\"token operator\">></span> <span class=\"token number\">1000</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// Liftoff -> TurboFan</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// and from React's side, it's just a module</span>\n<span class=\"token keyword\">const</span> wasm <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> WebAssembly<span class=\"token punctuation\">.</span><span class=\"token function\">instantiateStreaming</span><span class=\"token punctuation\">(</span>\n  <span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span><span class=\"token string\">'module.wasm'</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nwasm<span class=\"token punctuation\">.</span>instance<span class=\"token punctuation\">.</span>exports<span class=\"token punctuation\">.</span><span class=\"token function\">processImage</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h3 id=\"3-memory-and-sharing-a-collector\" style=\"position:relative;\"><a href=\"#3-memory-and-sharing-a-collector\" aria-label=\"3 memory and sharing a collector permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>3. Memory, and sharing a collector</h3>\n<p>WebAssembly traditionally used linear memory, one flat byte array. Perfect for C and C++, awkward the moment you want to hand a structured object back and forth with JavaScript.</p>\n<p>The <strong>WasmGC proposal</strong> (Chrome 119+) gives WebAssembly access to the same garbage collector JavaScript uses. That buys you references between JS objects and WASM structs, no manual <code class=\"language-text\">malloc</code>/<code class=\"language-text\">free</code>, cycles collected automatically, and a single predictable pause instead of two memory systems with separate behaviors.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// linear memory: still how most WASM works today</span>\n<span class=\"token keyword\">const</span> memory <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">WebAssembly<span class=\"token punctuation\">.</span>Memory</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n  initial<span class=\"token operator\">:</span> <span class=\"token number\">256</span><span class=\"token punctuation\">,</span>   <span class=\"token comment\">// 16MB</span>\n  maximum<span class=\"token operator\">:</span> <span class=\"token number\">32768</span>  <span class=\"token comment\">// 2GB</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// moving data across the boundary</span>\n<span class=\"token keyword\">const</span> view <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Uint8Array</span><span class=\"token punctuation\">(</span>memory<span class=\"token punctuation\">.</span>buffer<span class=\"token punctuation\">,</span> ptr<span class=\"token punctuation\">,</span> size<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nview<span class=\"token punctuation\">.</span><span class=\"token function\">set</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  <span class=\"token comment\">// JS -> WASM</span>\n\n<span class=\"token comment\">// WasmGC (Chrome 119+): managed objects instead</span>\n<span class=\"token comment\">// (type $point (struct (field $x f64) (field $y f64)))</span>\n<span class=\"token comment\">// same collector as JavaScript</span></code></pre></div>\n<h3 id=\"4-simd\" style=\"position:relative;\"><a href=\"#4-simd\" aria-label=\"4 simd permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>4. SIMD</h3>\n<p><strong>SIMD</strong>, or single instruction multiple data, processes several values with one instruction. V8 supports WebAssembly SIMD, which means access to the CPU’s vector units from the browser.</p>\n<p>What that’s worth in practice: four floats added at once for a 4x speedup on vector math, roughly 30x on a 512x512 matrix multiply, real-time blur and sharpen filters on images, and fluid simulations that hold 60fps.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// scalar JavaScript: one at a time</span>\n<span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">let</span> i <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;</span> arr<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  result<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> a<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span> <span class=\"token operator\">+</span> b<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// WASM SIMD: four at a time</span>\n<span class=\"token comment\">// (f32x4.add (v128.load a) (v128.load b))</span>\n\n<span class=\"token comment\">// measured: JS ~450ms -> WASM ~50ms -> SIMD ~15ms</span></code></pre></div>\n<h3 id=\"5-code-caching\" style=\"position:relative;\"><a href=\"#5-code-caching\" aria-label=\"5 code caching permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>5. Code caching</h3>\n<p>Large modules (10MB and up) can take seconds to compile. Doing that on every page load is not acceptable, so V8 caches the result: optimized machine code goes into IndexedDB, <code class=\"language-text\">WebAssembly.Module.serialize()</code> gives you the compiled artifact, a cache hit skips compilation entirely, and timestamps handle invalidation.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// caching compiled modules</span>\n<span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token function\">loadWithCache</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">url</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// 1. check the cache</span>\n  <span class=\"token keyword\">let</span> module <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> cache<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span>url<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>module<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// 2. compile and store</span>\n    module <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> WebAssembly<span class=\"token punctuation\">.</span><span class=\"token function\">compileStreaming</span><span class=\"token punctuation\">(</span>\n      <span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span>url<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">await</span> cache<span class=\"token punctuation\">.</span><span class=\"token function\">store</span><span class=\"token punctuation\">(</span>url<span class=\"token punctuation\">,</span> module<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">return</span> module<span class=\"token punctuation\">;</span>  <span class=\"token comment\">// no recompilation</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"6-does-it-pay-off\" style=\"position:relative;\"><a href=\"#6-does-it-pay-off\" aria-label=\"6 does it pay off permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>6. Does it pay off?</h3>\n<p>On compute-heavy work like matrix multiplication, WebAssembly runs 9-30x faster than JavaScript. The applications that exist because of that are the real argument: <strong>AutoCAD Web</strong> renders 3D CAD in a browser, <strong>Google Earth</strong> streams large 3D map data in real time, <strong>Figma</strong> runs its vector engine in WASM, and <strong>Photoshop Web</strong> applies filters at close to native speed.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// matrix multiply, 512x512</span>\n<span class=\"token comment\">// JavaScript:     ~450ms</span>\n<span class=\"token comment\">// WebAssembly:    ~50ms  (9x)</span>\n<span class=\"token comment\">// WASM + SIMD:    ~15ms  (30x)</span>\n\n<span class=\"token comment\">// image filtering from React</span>\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">applyFilter</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">async</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">imageData</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// JS filter:   ~50ms</span>\n  <span class=\"token comment\">// WASM filter: ~5ms</span>\n  <span class=\"token keyword\">return</span> wasmFilters<span class=\"token punctuation\">[</span>filterType<span class=\"token punctuation\">]</span><span class=\"token punctuation\">(</span>imageData<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>The pattern that’s emerging is a split one: JavaScript for business logic and UI, WebAssembly for the parts where the numbers hurt.</p>\n<h2 id=\"what-this-looks-like-in-production\" style=\"position:relative;\"><a href=\"#what-this-looks-like-in-production\" aria-label=\"what this looks like in production permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>What this looks like in production</h2>\n<h3 id=\"1-gmails-incremental-dom-updates\" style=\"position:relative;\"><a href=\"#1-gmails-incremental-dom-updates\" aria-label=\"1 gmails incremental dom updates permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>1. Gmail’s incremental DOM updates</h3>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">IncrementalRenderer</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>pendingUpdates <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">WeakMap</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>updateQueue <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">scheduleUpdate</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">element<span class=\"token punctuation\">,</span> patch</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// WeakMap so a detached element doesn't stay pinned</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>pendingUpdates<span class=\"token punctuation\">.</span><span class=\"token function\">set</span><span class=\"token punctuation\">(</span>element<span class=\"token punctuation\">,</span> patch<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">// spend idle time, not frame time</span>\n    <span class=\"token function\">requestIdleCallback</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">processBatch</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> timeout<span class=\"token operator\">:</span> <span class=\"token number\">16</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// one frame</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">processBatch</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> batchSize <span class=\"token operator\">=</span> <span class=\"token number\">100</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">let</span> i <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;</span> batchSize <span class=\"token operator\">&amp;&amp;</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>updateQueue<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">const</span> update <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>updateQueue<span class=\"token punctuation\">.</span><span class=\"token function\">shift</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token function\">update</span><span class=\"token punctuation\">.</span><span class=\"token function\">apply</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Result: <strong>70%</strong> fewer major collections, and frames held <strong>95%</strong> of the time.</p>\n<h3 id=\"2-discords-message-pooling\" style=\"position:relative;\"><a href=\"#2-discords-message-pooling\" aria-label=\"2 discords message pooling permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>2. Discord’s message pooling</h3>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">MessagePool</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">size <span class=\"token operator\">=</span> <span class=\"token number\">1000</span></span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>pool <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>activeMessages <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Set</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">// preallocate</span>\n    <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">let</span> i <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;</span> size<span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>pool<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">Message</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">acquire</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">let</span> msg <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>pool<span class=\"token punctuation\">.</span><span class=\"token function\">pop</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>msg<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token comment\">// ran dry, so grow, but say so</span>\n      console<span class=\"token punctuation\">.</span><span class=\"token function\">warn</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Pool expansion triggered'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      msg <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Message</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>activeMessages<span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span>msg<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">return</span> msg<span class=\"token punctuation\">.</span><span class=\"token function\">reset</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">release</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">msg</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>activeMessages<span class=\"token punctuation\">.</span><span class=\"token function\">delete</span><span class=\"token punctuation\">(</span>msg<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>pool<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span>msg<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Result: <strong>85%</strong> fewer Young Generation collections and <strong>30%</strong> less memory used.</p>\n<h3 id=\"measuring-it-yourself\" style=\"position:relative;\"><a href=\"#measuring-it-yourself\" aria-label=\"measuring it yourself permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Measuring it yourself</h3>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// GC events via the Performance API</span>\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">V8Profiler</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">static</span> <span class=\"token function\">measureGC</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> obs <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">PerformanceObserver</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">list</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">const</span> entry <span class=\"token keyword\">of</span> list<span class=\"token punctuation\">.</span><span class=\"token function\">getEntries</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>entry<span class=\"token punctuation\">.</span>entryType <span class=\"token operator\">===</span> <span class=\"token string\">'measure'</span> <span class=\"token operator\">&amp;&amp;</span>\n            entry<span class=\"token punctuation\">.</span>detail<span class=\"token operator\">?.</span>kind <span class=\"token operator\">===</span> <span class=\"token string\">'gc'</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n          console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">GC Type: </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>entry<span class=\"token punctuation\">.</span>detail<span class=\"token punctuation\">.</span>type<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n          console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">Duration: </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>entry<span class=\"token punctuation\">.</span>duration<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">ms</span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n          console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">Heap Before: </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>entry<span class=\"token punctuation\">.</span>detail<span class=\"token punctuation\">.</span>usedHeapSizeBefore<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n          console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">Heap After: </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>entry<span class=\"token punctuation\">.</span>detail<span class=\"token punctuation\">.</span>usedHeapSizeAfter<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    obs<span class=\"token punctuation\">.</span><span class=\"token function\">observe</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> entryTypes<span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'measure'</span><span class=\"token punctuation\">]</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">static</span> <span class=\"token function\">getHeapSnapshot</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">typeof</span> gc <span class=\"token operator\">!==</span> <span class=\"token string\">'undefined'</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token function\">gc</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// requires --expose-gc</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">return</span> performance<span class=\"token punctuation\">.</span><span class=\"token function\">measureUserAgentSpecificMemory</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p><strong>Pointer compression (Chrome 89)</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">Environment: 8GB RAM, 4-core CPU\nApps: Gmail, Google Docs, YouTube\n\nResults:\n- V8 Heap: 1.2GB -> 684MB (43% less)\n- Renderer Memory: 2.1GB -> 1.68GB (20% less)\n- Major GC Time: 45ms -> 38.7ms (14% less)\n- FID p95: 24ms -> 19ms</code></pre></div>\n<p><strong>Orinoco vs the old collector</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">Benchmark: Speedometer 2.0\n\nLegacy (2015):\n- Score: 45 ± 3\n- GC Pause p50: 23ms\n- GC Pause p99: 112ms\n- Total GC Time: 3.2s\n\nOrinoco (2019):\n- Score: 78 ± 2 (73% better)\n- GC Pause p50: 2.1ms (91% lower)\n- GC Pause p99: 14ms (87% lower)\n- Total GC Time: 0.9s (72% lower)</code></pre></div>\n<p>The p99 line is the one to read twice. A p50 of 2ms is nice; a p99 of 112ms dropping to 14ms is the difference between an app that occasionally stutters for no visible reason and one that doesn’t.</p>\n<h3 id=\"a-checklist\" style=\"position:relative;\"><a href=\"#a-checklist\" aria-label=\"a checklist permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>A checklist</h3>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> optimizationChecklist <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// 1. Hidden Classes</span>\n  avoidDynamicProperties<span class=\"token operator\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span>\n  useConstructorsConsistently<span class=\"token operator\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span>\n\n  <span class=\"token comment\">// 2. inline caches</span>\n  avoidPolymorphicCalls<span class=\"token operator\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span>\n  limitFunctionTypes<span class=\"token operator\">:</span> <span class=\"token number\">4</span><span class=\"token punctuation\">,</span>\n\n  <span class=\"token comment\">// 3. memory</span>\n  useObjectPools<span class=\"token operator\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span>\n  limitClosureScopes<span class=\"token operator\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span>\n  preferTypedArrays<span class=\"token operator\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span>\n\n  <span class=\"token comment\">// 4. fewer collections</span>\n  batchDOMUpdates<span class=\"token operator\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span>\n  useWeakReferences<span class=\"token operator\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span>\n  clearLargeObjects<span class=\"token operator\">:</span> <span class=\"token boolean\">true</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h2 id=\"wrapping-up\" style=\"position:relative;\"><a href=\"#wrapping-up\" aria-label=\"wrapping up permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Wrapping up</h2>\n<p>V8 stopped being a JavaScript engine some time ago; it’s a system. It’s not an accident that its components are named after engine parts and car technology: Ignition, TurboFan, Orinoco. That’s the shape of the thing: separate pieces, machined to fit, and the whole point is that they mesh. It’s the reason a browser tab can now do work that used to require a native application.</p>\n<p>I won’t pretend this was an easy post to write. Most of it came out of V8 team papers, their blog, and reading the source, and some of it I only understood on the third pass. What I keep coming back to is a smaller question than any of the machinery above: given all this engineering, what is it actually asking of us? Mostly, I think, that we stop making the engine guess: keep object shapes stable, keep types consistent, and don’t hold references longer than we need to. None of that is exotic. It’s just the part we’re responsible for.</p>\n<p>Last thing: thanks to everyone who’s contributed to V8. It’s an extraordinary piece of open source.</p>\n<h3 id=\"bonus-whats-still-open\" style=\"position:relative;\"><a href=\"#bonus-whats-still-open\" aria-label=\"bonus whats still open permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Bonus: what’s still open</h3>\n<ul>\n<li><strong>Better WASM integration</strong>: finishing WasmGC</li>\n<li><strong>ML-driven optimization</strong>: pattern-based automatic tuning</li>\n<li><strong>New hardware</strong>: ARM and RISC-V tuning</li>\n</ul>\n<h2 id=\"references\" style=\"position:relative;\"><a href=\"#references\" aria-label=\"references permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>References</h2>\n<ul>\n<li><a href=\"https://v8.dev/docs\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">V8 Official Documentation</a></li>\n<li><a href=\"https://github.com/v8/v8\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">V8 GitHub Repository</a></li>\n<li><a href=\"https://v8.dev/blog/orinoco-parallel-scavenger\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">V8 Orinoco Parallel Scavenger</a></li>\n<li><a href=\"https://v8.dev/blog/orinoco\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Jank Busters Part 2: Orinoco</a></li>\n<li><a href=\"https://v8.dev/blog/pointer-compression\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Pointer Compression in V8</a></li>\n<li><a href=\"https://arxiv.org/abs/1801.03763\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">To Pool or Not to Pool? Revisiting an Old Pattern</a></li>\n<li><a href=\"https://v8.dev/blog/wasm-gc-porting\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">WASM GC Porting</a></li>\n<li><a href=\"https://v8.dev/blog/react-cliff\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">The story of a V8 performance cliff in React</a></li>\n</ul>","timeToRead":30,"frontmatter":{"title":"V8 and WebAssembly: how a modern JavaScript engine buys its speed","date":"July 04, 2025","description":"V8 is the reason JavaScript stopped being slow. But most of us never look at how it actually manages memory: how a garbage collector that used to freeze the page for 50ms now finishes in two, and what that machinery costs when you put React on top of it.","tags":["v8","chrome","garbage collector","javascript","react","webassembly","performance"]},"fields":{"langKey":"en"}}},"pageContext":{"slug":"/en/chrome-gc/","previous":{"fields":{"slug":"/en/web-to-figma-tools-2026/","langKey":"en","directoryName":"web-to-figma-tools-2026"},"frontmatter":{"date":"July 08, 2026","title":"I ran three web-to-Figma tools on a real project: here's what broke","tags":["figma","html.to.design","html2design","design-tools","chrome-extension"]}},"next":null,"previousInSameTag":{"fields":{"slug":"/chrome-gc/","langKey":"ko","directoryName":"chrome-gc"},"frontmatter":{"date":"July 04, 2025","title":"V8과 WebAssembly: 현대 자바스크립트 엔진의 구조와 성능 최적화(상하편)","tags":["v8","chrome","garbage collector","javascript","react","webassembly","performance"]}},"nextInSameTag":{"fields":{"slug":"/chrome-gc-part2/","langKey":"ko","directoryName":"chrome-gc-part2"},"frontmatter":{"date":"July 03, 2025","title":"V8 엔진의 메모리 관리 전략: Orinoco 프로젝트와 현대적 최적화 (하편)","tags":["v8","chrome","garbage collector","javascript","webassembly","performance"]}},"translationsLink":[{"name":"Korean","url":"/chrome-gc/"}]}},
    "staticQueryHashes": ["1522010811","1558996917","1615650028","3765107650"]}