Skip to content

Conversation

hoxyq
Copy link
Contributor

@hoxyq hoxyq commented Oct 10, 2025

Fixes #34770.

We need to clear measures at some point, otherwise all these copies of props that we end up recording will allocate too much memory in Chromium. This adds performance.clearMeasures(...) calls to such cases in DEV.

Validated that entries are still shown on Performance panel timeline.

@hoxyq hoxyq requested review from eps1lon and sebmarkbage October 10, 2025 18:14
@meta-cla meta-cla bot added the CLA Signed label Oct 10, 2025
};

const resuableChangedPropsEntry = ['Changed Props', ''];
const reusableChangedPropsEntry = ['Changed Props', ''];
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

drive-by typo fix

@react-sizebot
Copy link

react-sizebot commented Oct 10, 2025

Comparing: 47905a7...b42f3b2

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name +/- Base Current +/- gzip Base gzip Current gzip
oss-stable/react-dom/cjs/react-dom.production.js = 6.68 kB 6.68 kB = 1.83 kB 1.83 kB
oss-stable/react-dom/cjs/react-dom-client.production.js = 605.41 kB 605.41 kB = 107.22 kB 107.21 kB
oss-experimental/react-dom/cjs/react-dom.production.js = 6.69 kB 6.69 kB = 1.83 kB 1.83 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js = 664.38 kB 664.38 kB = 117.09 kB 117.09 kB
facebook-www/ReactDOM-prod.classic.js = 688.25 kB 688.25 kB = 121.13 kB 121.13 kB
facebook-www/ReactDOM-prod.modern.js = 678.67 kB 678.67 kB = 119.48 kB 119.48 kB

Significant size changes

Includes any change greater than 0.2%:

Expand to show
Name +/- Base Current +/- gzip Base gzip Current gzip
oss-stable-semver/react-client/cjs/react-client-flight.development.js +0.41% 171.73 kB 172.43 kB +0.31% 29.92 kB 30.02 kB
oss-stable/react-client/cjs/react-client-flight.development.js +0.41% 171.75 kB 172.45 kB +0.31% 29.94 kB 30.04 kB
oss-experimental/react-client/cjs/react-client-flight.development.js +0.40% 172.63 kB 173.33 kB +0.32% 30.09 kB 30.18 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.development.js +0.40% 176.32 kB 177.02 kB +0.32% 30.97 kB 31.07 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.development.js +0.40% 176.37 kB 177.07 kB +0.31% 31.00 kB 31.09 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.development.js +0.39% 176.92 kB 177.61 kB +0.30% 31.41 kB 31.50 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.development.js +0.39% 176.92 kB 177.61 kB +0.30% 31.41 kB 31.50 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.development.js +0.39% 177.25 kB 177.95 kB +0.29% 31.14 kB 31.23 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.development.js +0.39% 177.82 kB 178.51 kB +0.30% 31.54 kB 31.64 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js +0.39% 178.28 kB 178.98 kB +0.28% 31.42 kB 31.50 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js +0.39% 178.33 kB 179.03 kB +0.27% 31.44 kB 31.53 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js +0.39% 179.22 kB 179.91 kB +0.30% 31.58 kB 31.67 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js +0.39% 180.12 kB 180.82 kB +0.29% 31.90 kB 31.99 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js +0.39% 180.12 kB 180.82 kB +0.29% 31.90 kB 31.99 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js +0.39% 180.15 kB 180.84 kB +0.29% 31.92 kB 32.01 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js +0.39% 180.15 kB 180.84 kB +0.29% 31.92 kB 32.01 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js +0.39% 180.86 kB 181.56 kB +0.29% 31.90 kB 31.99 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js +0.39% 180.91 kB 181.61 kB +0.29% 31.92 kB 32.02 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js +0.39% 181.03 kB 181.72 kB +0.29% 32.04 kB 32.13 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js +0.38% 181.05 kB 181.75 kB +0.30% 32.05 kB 32.15 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js +0.38% 181.38 kB 182.08 kB +0.29% 32.06 kB 32.15 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js +0.38% 181.38 kB 182.08 kB +0.29% 32.06 kB 32.15 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js +0.38% 181.48 kB 182.18 kB +0.31% 32.06 kB 32.16 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js +0.38% 181.53 kB 182.23 kB +0.31% 32.09 kB 32.19 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js +0.38% 181.79 kB 182.49 kB +0.29% 32.07 kB 32.16 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js +0.38% 182.25 kB 182.95 kB +0.30% 32.20 kB 32.29 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js +0.38% 182.41 kB 183.11 kB +0.30% 32.23 kB 32.33 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.development.js +0.38% 183.06 kB 183.76 kB +0.30% 32.11 kB 32.20 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.development.js +0.38% 183.06 kB 183.76 kB +0.30% 32.11 kB 32.20 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.development.js +0.38% 183.93 kB 184.62 kB +0.29% 32.25 kB 32.34 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js +0.38% 184.76 kB 185.46 kB +0.30% 32.37 kB 32.47 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js +0.38% 184.76 kB 185.46 kB +0.30% 32.37 kB 32.47 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js +0.38% 185.63 kB 186.33 kB +0.29% 32.52 kB 32.61 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js +0.37% 186.17 kB 186.87 kB +0.30% 32.63 kB 32.72 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js +0.37% 186.17 kB 186.87 kB +0.30% 32.63 kB 32.72 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js +0.37% 186.19 kB 186.89 kB +0.29% 32.64 kB 32.74 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js +0.37% 186.19 kB 186.89 kB +0.29% 32.64 kB 32.74 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js +0.37% 187.04 kB 187.74 kB +0.30% 32.77 kB 32.87 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js +0.37% 187.06 kB 187.76 kB +0.29% 32.78 kB 32.88 kB
oss-stable-semver/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js +0.24% 222.30 kB 222.83 kB +0.11% 49.15 kB 49.20 kB
oss-stable/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js +0.24% 222.32 kB 222.85 kB +0.12% 49.17 kB 49.23 kB
oss-experimental/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js +0.24% 223.46 kB 223.99 kB +0.11% 49.38 kB 49.44 kB

Generated by 🚫 dangerJS against b42f3b2

Copy link
Collaborator

@eps1lon eps1lon left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The only drawback I can think of right now is that they won't be available in performance.getEntries() and PerformanceObserver, but that doesn't really make any sense for DEV envs.

Why not? These APIs can be used to display the data in custom profiler UIs that want more control over what and how they display data.

Is Chrome indefinitely holding onto these entries even if no PerformanceObserver is registered?

@hoxyq
Copy link
Contributor Author

hoxyq commented Oct 13, 2025

Why not? These APIs can be used to display the data in custom profiler UIs that want more control over what and how they display data.

It is technically feasible, I am just not sure why would someone do it via User Timings in DEV.

Is Chrome indefinitely holding onto these entries even if no PerformanceObserver is registered?

I am not sure, but it looks like so. Having an Observer doesn't imply clearing buffered entries, so I guess we need to do it manually.

I think we should do it after every .mark() or .measure() calls, unfortunately.

I've validated that clearing measures doesn't affect availability of entries to PerformanceObserver, to it is still notified when measure is created. This is also mentioned in the spec.

@hoxyq hoxyq force-pushed the perf-tracks/clear-expensive-measures branch from 0d9a0b5 to 41bc2de Compare October 13, 2025 17:27
@eps1lon
Copy link
Collaborator

eps1lon commented Oct 13, 2025

I've validated that clearing measures doesn't affect availability of entries to PerformanceObserver, to it is still notified when measure is created. This is also mentioned in the spec.

So it's just the getEntriesByType that would no longer be able to read values? That seems fine to me though the PR description still says it also affects observers.

Though I don't see how the linked spec text confirms that.

@hoxyq
Copy link
Contributor Author

hoxyq commented Oct 13, 2025

So it's just the getEntriesByType that would no longer be able to read values? That seems fine to me though the PR description still says it also affects observers.

Sorry, summary was not up to date, actually PerformanceObserver should not be affected at all.

Though I don't see how the linked spec text confirms that.

The value is pushed to the observed entries list as part of the measure() call. Then, the PerformanceObserver task is scheduled, but it has a lower priority. Even if the .clearMeasures() will end up executing first, it should not clear the value from the internal PerformanceObserver's buffer.

@hoxyq hoxyq force-pushed the perf-tracks/clear-expensive-measures branch from 41bc2de to 11a58a3 Compare October 13, 2025 21:26
@hoxyq hoxyq force-pushed the perf-tracks/clear-expensive-measures branch from 11a58a3 to b42f3b2 Compare October 13, 2025 21:34
@hoxyq hoxyq merged commit b9ec735 into facebook:main Oct 13, 2025
240 of 241 checks passed
@hoxyq hoxyq deleted the perf-tracks/clear-expensive-measures branch October 13, 2025 21:42
github-actions bot pushed a commit that referenced this pull request Oct 13, 2025
Fixes #34770.

We need to clear measures at some point, otherwise all these copies of
props that we end up recording will allocate too much memory in
Chromium. This adds `performance.clearMeasures(...)` calls to such cases
in DEV.

Validated that entries are still shown on Performance panel timeline.

DiffTrain build for [b9ec735](b9ec735)
github-actions bot pushed a commit that referenced this pull request Oct 13, 2025
Fixes #34770.

We need to clear measures at some point, otherwise all these copies of
props that we end up recording will allocate too much memory in
Chromium. This adds `performance.clearMeasures(...)` calls to such cases
in DEV.

Validated that entries are still shown on Performance panel timeline.

DiffTrain build for [b9ec735](b9ec735)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Bug: Massive memory allocations using React dev build under frequent updates (prod build unaffected)

3 participants