perf(web): release track map listeners explicitly
This commit is contained in:
@@ -2,6 +2,22 @@
|
||||
|
||||
This document records verified risks, the production controls that address them, and the next evidence to collect. It is intentionally operational: a passing build alone is not proof that the browser application is production-ready.
|
||||
|
||||
## 2026-07-16: 50-cycle authenticated route soak
|
||||
|
||||
The production ECS application completed 50 authenticated `monitor -> history -> statistics -> tracks -> monitor` cycles. Chrome performance and heap metrics were sampled every five cycles. Because the Browser channel does not permit `HeapProfiler.collectGarbage`, the gate uses post-warmup and 15-second-idle low-water marks instead of comparing transient allocation peaks.
|
||||
|
||||
| Metric | After 10 warm cycles and natural collection | After 50 cycles and 15 seconds idle | Result |
|
||||
| --- | ---: | ---: | --- |
|
||||
| JS heap used | 26.52 MB | 28.53 MB | Stable; +2.01 MB |
|
||||
| Event listeners | 880 | 686 | No monotonic growth |
|
||||
| DOM nodes | 7,763 | 4,811 | No monotonic growth |
|
||||
| Detached script states | 0 | 0 | Fully released |
|
||||
| Live page DOM | — | 1 AMap iframe / 1 map container | Only the active monitor map remains |
|
||||
|
||||
Transient peaks reached 165.83 MB while route effects and AMap instances overlapped, then returned to the low-water mark after natural collection. The final page remained `/monitor`, rendered live fleet statistics, and had zero console warnings or errors. This proves that the explicit query, map and listener cleanup prevents sustained growth under this route pattern; it does not replace a future allocation profile for data-heavy operator interactions.
|
||||
|
||||
The audit found one remaining lifecycle asymmetry: track start, end and stop markers registered anonymous click handlers and relied on overlay removal to release them. Track overlays now retain each handler identity and call `off('click', handler)` before redraw and unmount. `TrackMap.test.tsx` asserts every marker handler, the map drag handler, overlays and the map instance are released.
|
||||
|
||||
## 2026-07-16: monitor lifecycle and responsive rendering
|
||||
|
||||
The monitor's high-volume fleet, map and selected-vehicle queries now use immediate inactive-cache collection instead of inheriting the global five-minute retention. The detail card owns its detail, alert and address queries, so collapsing or clearing the card unmounts its observers while the separate selected-vehicle stream continues to move the map. Repeated viewport and vehicle-selection tests assert that only the active payload remains and that detail-card queries reach zero after unmount.
|
||||
@@ -40,7 +56,7 @@ The navigation and progressive-loading direction follows mature observability sy
|
||||
|
||||
### Remaining audit queue
|
||||
|
||||
1. Capture a Chrome heap profile across at least 50 `monitor -> history -> statistics -> tracks` cycles and inspect retained AMap objects and detached DOM nodes.
|
||||
1. Capture an allocation profile for data-heavy operator interactions: loaded history series, long track playback and repeated Excel exports.
|
||||
2. Bound or explicitly evict other high-cardinality query families, especially arbitrary history windows and track playback ranges.
|
||||
3. Retire or migrate the remaining legacy `App.tsx` integration suite after its compatibility coverage is replaced in V2.
|
||||
4. Preserve ExcelJS as an action-only dynamic import and consider moving large workbook generation off the main thread.
|
||||
|
||||
Reference in New Issue
Block a user