Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bug: memory leak in useReducer #21692

Open
onnlucky opened this issue Jun 16, 2021 · 11 comments
Open

Bug: memory leak in useReducer #21692

onnlucky opened this issue Jun 16, 2021 · 11 comments
Labels
Status: Unconfirmed A potential issue that we haven't yet confirmed as a bug

Comments

@onnlucky
Copy link

onnlucky commented Jun 16, 2021

React version: 17.0.2

When using React.useReducer() and a new action is pushed, but the reducer returns the current state, the operation is queued in a pending queue. But if the component isn't re-rendered for other reasons, it will never start work on that pending queue. This can potentially rack up a huge list of pending.next.next.next.next...

Steps To Reproduce

  1. https://codesandbox.io/s/unruffled-moore-wp5wq?file=/src/App.js
  2. click increment a few times
  3. place a breakpoint in react-dom.development.js line 16072, click increment, that should hit the break point, then expand queue.pending.next.next.next and see they are unique actions. (
    const pending = queue.pending;
    )

Link to code example: https://codesandbox.io/s/unruffled-moore-wp5wq?file=/src/App.js

The current behavior

There is no change in behavior, but it is potentially racking up an enormous list of pending tasks, costing memory.

The expected behavior

Flat memory usage. Reducer doesn't run twice on the same action.

This is very much related to #15198 because later the reducer might run, and basically reduce the same actions again. Which is unexpected. And if using side-effects, doesn't produce the expected results.

Other related bugs: #17953 #15088

@onnlucky onnlucky added the Status: Unconfirmed A potential issue that we haven't yet confirmed as a bug label Jun 16, 2021
@onnlucky
Copy link
Author

For a second example that doesn't have any side effects, thus doesn't trigger #15198, but still has the memory leak, see here: https://codesandbox.io/s/bold-sun-k5nig?file=/src/App.js

@stale
Copy link

stale bot commented Jan 9, 2022

This issue has been automatically marked as stale. If this issue is still affecting you, please leave any comment (for example, "bump"), and we'll keep it open. We are sorry that we haven't been able to prioritize it yet. If you have any new additional information, please include it with your comment!

@stale stale bot added the Resolution: Stale Automatically closed due to inactivity label Jan 9, 2022
@dcporter
Copy link

dcporter commented Jan 9, 2022

Bump

@stale stale bot removed the Resolution: Stale Automatically closed due to inactivity label Jan 9, 2022
@bellmatthewf
Copy link

bump

@pbadenski
Copy link

It's surprising that this issue isn't even acknowledged..

Copy link

This issue has been automatically marked as stale. If this issue is still affecting you, please leave any comment (for example, "bump"), and we'll keep it open. We are sorry that we haven't been able to prioritize it yet. If you have any new additional information, please include it with your comment!

@github-actions github-actions bot added the Resolution: Stale Automatically closed due to inactivity label Apr 10, 2024
@dcporter
Copy link

buuuuuuump

@github-actions github-actions bot removed the Resolution: Stale Automatically closed due to inactivity label Apr 12, 2024
@mariomerendino
Copy link

Bump

@NMinhNguyen
Copy link
Contributor

NMinhNguyen commented May 15, 2024

The CodeSandbox repro no longer results in a memory leak using 18.3.1 for what it’s worth, so this particular issue can probably be marked as fixed unless a more up-to-date repro is provided. I did notice that using 17.0.2 React would accumulate all the actions that were dispatched while the reducer returned the same state, and subsequently replay them, but that’s no longer the case using the latest React (fixed in #22445)

@mariomerendino
Copy link

The CodeSandbox repro no longer results in a memory leak using 18.3.1 for what it’s worth, so this particular issue can probably be marked as fixed unless a more up-to-date repro is provided. I did notice that using 17.0.2 React would accumulate all the actions that were dispatched while the reducer returned the same state, and subsequently replay them, but that’s no longer the case using the latest React.

Thank you for the reply!! The project I noticed this is using React 16, so I definitely need to upgrade.

@NMinhNguyen
Copy link
Contributor

NMinhNguyen commented May 15, 2024

That being said, I believe this still reproduces: #28981. However, I believe that issue is fixed by #25309 in React 19.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Status: Unconfirmed A potential issue that we haven't yet confirmed as a bug
Projects
None yet
Development

No branches or pull requests

6 participants