[PR #468] [CLOSED] chore: memory investigation harnesses + native metrics #1341

Closed
opened 2026-03-14 09:31:26 +03:00 by kerem · 0 comments
Owner

📋 Pull Request Information

Original PR: https://github.com/anomalyco/opentui/pull/468
Author: @monotykamary
Created: 1/3/2026
Status: Closed

Base: mainHead: memory/opencode-metrics


📝 Commits (1)

  • 3cc5ab0 fix(memory): add harnesses and native metrics

📊 Changes

23 files changed (+1630 additions, -41 deletions)

View changed files

packages/core/dev/memory-leak-harness.ts (+195 -0)
packages/core/dev/native-metrics.jsonl (+55 -0)
📝 packages/core/src/console.test.ts (+6 -2)
packages/core/src/lib/tree-sitter/data-paths-listeners.test.ts (+42 -0)
📝 packages/core/src/lib/tree-sitter/index.ts (+10 -2)
📝 packages/core/src/renderables/Code.ts (+25 -7)
📝 packages/core/src/renderables/Diff.ts (+46 -4)
📝 packages/core/src/renderables/TextBufferRenderable.ts (+5 -2)
packages/core/src/renderables/__tests__/Code.highlight-queue.test.ts (+54 -0)
packages/core/src/renderables/__tests__/syntax-style-cleanup.test.ts (+63 -0)
📝 packages/core/src/text-buffer-view.ts (+11 -0)
📝 packages/core/src/text-buffer.test.ts (+37 -0)
📝 packages/core/src/text-buffer.ts (+41 -2)
📝 packages/core/src/zig.ts (+184 -0)
📝 packages/core/src/zig/grapheme.zig (+54 -0)
📝 packages/core/src/zig/lib.zig (+86 -0)
📝 packages/core/src/zig/syntax-style.zig (+51 -0)
📝 packages/core/src/zig/text-buffer.zig (+69 -8)
📝 packages/react/src/reconciler/devtools-polyfill.ts (+1 -7)
📝 packages/react/src/reconciler/reconciler.ts (+1 -1)

...and 3 more files

📄 Description

Intent

This PR is diagnostic-only to document memory behavior and leak suspects observed via opencode-style harnesses. It is not intended to be merged as-is.

Approach

  • Added Solid harnesses that simulate opencode session rendering (code/reasoning/diff) and generic streaming updates.
  • Added native metrics sampling (text buffer arenas, rope segments, mem registry, highlight caches, grapheme pool) and renderable counts.
  • Logged metrics to packages/core/dev/native-metrics.jsonl for repeatable runs.
  • Fixed Solid reconciler removal to destroy renderables immediately (avoids next-tick backlog growth) and added cleanup regression tests.

Metrics (native-metrics.jsonl)

Run Harness Mode Iter Streaming Final/Peak RSS MB Renderables TextBuffers Arena MB View Arena MB Highlights Grapheme used/total
mjyrzvhk-i2mt8f solid code (highlight=false) 400 true 30.75 / 83.63 253 120 9.37 0.00 0/0 0/0
mjys0ilj-wi5rfq solid text (highlight=true) 400 true 133.39 / 157.80 253 120 9.39 0.00 11520/8640 0/0
mjys14pg-sii5ly solid code (highlight=true) 400 true 94.52 / 96.31 253 120 0.02 0.00 0/0 0/0
mjyryg7b-zj2fth opencode diff=true emoji=true 300 true 130.52 / 204.73 1573 600 2.60 3.98 351/519 0/256
mjys1g1w-6uh48b opencode diff=true emoji=true 300 false 153.84 / 163.17 1573 600 4.03 1.19 901/1469 0/256

Notes:

  • Renderable counts and text buffer counts plateau at maxMessages across runs.
  • RSS growth is bounded after plateau; no monotonic growth was observed once the list size stabilizes.
  • Grapheme pool usage remains flat even when emoji stress is enabled.

🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.

## 📋 Pull Request Information **Original PR:** https://github.com/anomalyco/opentui/pull/468 **Author:** [@monotykamary](https://github.com/monotykamary) **Created:** 1/3/2026 **Status:** ❌ Closed **Base:** `main` ← **Head:** `memory/opencode-metrics` --- ### 📝 Commits (1) - [`3cc5ab0`](https://github.com/anomalyco/opentui/commit/3cc5ab0a9d66190703d93247fc431b7de1791c52) fix(memory): add harnesses and native metrics ### 📊 Changes **23 files changed** (+1630 additions, -41 deletions) <details> <summary>View changed files</summary> ➕ `packages/core/dev/memory-leak-harness.ts` (+195 -0) ➕ `packages/core/dev/native-metrics.jsonl` (+55 -0) 📝 `packages/core/src/console.test.ts` (+6 -2) ➕ `packages/core/src/lib/tree-sitter/data-paths-listeners.test.ts` (+42 -0) 📝 `packages/core/src/lib/tree-sitter/index.ts` (+10 -2) 📝 `packages/core/src/renderables/Code.ts` (+25 -7) 📝 `packages/core/src/renderables/Diff.ts` (+46 -4) 📝 `packages/core/src/renderables/TextBufferRenderable.ts` (+5 -2) ➕ `packages/core/src/renderables/__tests__/Code.highlight-queue.test.ts` (+54 -0) ➕ `packages/core/src/renderables/__tests__/syntax-style-cleanup.test.ts` (+63 -0) 📝 `packages/core/src/text-buffer-view.ts` (+11 -0) 📝 `packages/core/src/text-buffer.test.ts` (+37 -0) 📝 `packages/core/src/text-buffer.ts` (+41 -2) 📝 `packages/core/src/zig.ts` (+184 -0) 📝 `packages/core/src/zig/grapheme.zig` (+54 -0) 📝 `packages/core/src/zig/lib.zig` (+86 -0) 📝 `packages/core/src/zig/syntax-style.zig` (+51 -0) 📝 `packages/core/src/zig/text-buffer.zig` (+69 -8) 📝 `packages/react/src/reconciler/devtools-polyfill.ts` (+1 -7) 📝 `packages/react/src/reconciler/reconciler.ts` (+1 -1) _...and 3 more files_ </details> ### 📄 Description ## Intent This PR is **diagnostic-only** to document memory behavior and leak suspects observed via opencode-style harnesses. It is not intended to be merged as-is. ## Approach - Added Solid harnesses that simulate opencode session rendering (code/reasoning/diff) and generic streaming updates. - Added native metrics sampling (text buffer arenas, rope segments, mem registry, highlight caches, grapheme pool) and renderable counts. - Logged metrics to `packages/core/dev/native-metrics.jsonl` for repeatable runs. - Fixed Solid reconciler removal to destroy renderables immediately (avoids next-tick backlog growth) and added cleanup regression tests. ## Metrics (native-metrics.jsonl) | Run | Harness | Mode | Iter | Streaming | Final/Peak RSS MB | Renderables | TextBuffers | Arena MB | View Arena MB | Highlights | Grapheme used/total | | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | | mjyrzvhk-i2mt8f | solid | code (highlight=false) | 400 | true | 30.75 / 83.63 | 253 | 120 | 9.37 | 0.00 | 0/0 | 0/0 | | mjys0ilj-wi5rfq | solid | text (highlight=true) | 400 | true | 133.39 / 157.80 | 253 | 120 | 9.39 | 0.00 | 11520/8640 | 0/0 | | mjys14pg-sii5ly | solid | code (highlight=true) | 400 | true | 94.52 / 96.31 | 253 | 120 | 0.02 | 0.00 | 0/0 | 0/0 | | mjyryg7b-zj2fth | opencode | diff=true emoji=true | 300 | true | 130.52 / 204.73 | 1573 | 600 | 2.60 | 3.98 | 351/519 | 0/256 | | mjys1g1w-6uh48b | opencode | diff=true emoji=true | 300 | false | 153.84 / 163.17 | 1573 | 600 | 4.03 | 1.19 | 901/1469 | 0/256 | Notes: - Renderable counts and text buffer counts plateau at `maxMessages` across runs. - RSS growth is bounded after plateau; no monotonic growth was observed once the list size stabilizes. - Grapheme pool usage remains flat even when emoji stress is enabled. --- <sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
kerem 2026-03-14 09:31:26 +03:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
starred/opentui#1341
No description provided.