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

vue2.7 keep-alive removed component no memory free #12827

Closed
mjsong07 opened this issue Oct 14, 2022 · 9 comments
Closed

vue2.7 keep-alive removed component no memory free #12827

mjsong07 opened this issue Oct 14, 2022 · 9 comments

Comments

@mjsong07
Copy link

Version

2.7.12

Reproduction link

github.com

Steps to reproduce

  1. npm install
  2. npm run serve
  3. Open the browser and input the http://localhost:8080/
  4. Click the add button to create a1-component.
  5. Click the add button to create a2-component.
  6. Click the add button to create a3-component.
  7. Click the add button to create a4-component .
  8. Click the a4-component delete button to remove a4-component

What is expected?

click the a4-component delete button ,I expected the usedJSHeapSize total is 250mb,but it didn't happen.

What is actually happening?

the usedJSHeapSize total still is about 330mb.


When you click the add button ,the usedJSHeapSize will increase about 80mb.
click four times ,the usedJSHeapSize total is about 330mb.
next click the a4-component delete button ,the usedJSHeapSize Should be reduce 80mb,expected is about 250mb.
but usedJSHeapSize total still is about 330mb.
you can view operating_steps.gif Steps to reproduce and view memory_analysis.gif to find the memory leak reason.
use the chrome memory tool and analysis report ,We can find The bug because
the a3-component.componentInstance.$vnode.parent.componentOptions.children[0] is a4-component.so the a4-component can not be Memory free.
If you can read chinese ,Open the link for https://juejin.cn/post/7153186266300252168

@mjsong07
Copy link
Author

Steps to reproduce
operating_steps

We can find The bug because
the a3-component.componentInstance.$vnode.parent.componentOptions.children[0] is a4-component.so the a4-component can not be Memory free.
memory_analysis

@mjsong07 mjsong07 changed the title keepalive-memory-leak-bug keepalive memory leak Oct 15, 2022
@mjsong07 mjsong07 changed the title keepalive memory leak vue2.7 keep-alive removed component no memory free Oct 15, 2022
@xztl
Copy link

xztl commented Nov 3, 2022

问题遇到+1

@mjsong07
Copy link
Author

问题遇到+1

看来遇到的人不多,只能换方案去解决了 keepalive的问题 >_<

@vela666
Copy link

vela666 commented Nov 24, 2022

惊现 面试官

@ning0825
Copy link

ning0825 commented Dec 7, 2022

你好,问题解决了么~

@mjsong07
Copy link
Author

你好,问题解决了么~

内存问题没解决,用别的思路规避大量重复创建组件带来的大量内存占用问题。比如共用同一个页签组件不销毁,只是切换data数据。

@DeiviA
Copy link

DeiviA commented Jan 18, 2023

I have the same issue. Any updates on this?

@Sapphire2k
Copy link

Any updates on this?

@erlangera
Copy link

erlangera commented Sep 1, 2023

我推测的主要原因是在 /src/core/components/keep-alive.ts里面清除缓存的方法里面有个判断 if (entry && (!current || entry.tag !== current.tag)) {导致如果要清除的Entry的tag与当前实例tag相同则跳过了强制destroy,个人认为这里应该使用vnode的key进行进一步判断。如 if (entry && (!current || entry.tag !== current.tag || entry.componentInstance.$vnode.key !== current.key)) {

function pruneCacheEntry(
  cache: CacheEntryMap,
  key: string,
  keys: Array<string>,
  current?: VNode
) {
  const entry = cache[key]
  if (entry && (!current || entry.tag !== current.tag)) {
    // @ts-expect-error can be undefined
    entry.componentInstance.$destroy()
  }
  cache[key] = null
  remove(keys, key)
}``` 

@vuejs vuejs deleted a comment from xztl Dec 7, 2023
@vuejs vuejs deleted a comment from xztl Dec 7, 2023
@vuejs vuejs deleted a comment from xztl Dec 7, 2023
@vuejs vuejs deleted a comment from xztl Dec 7, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

7 participants