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

Memory leak when using "transition" and "keep-alive" #9842

Closed
Aaron-Bird opened this issue Apr 7, 2019 · 6 comments · Fixed by #12015
Closed

Memory leak when using "transition" and "keep-alive" #9842

Aaron-Bird opened this issue Apr 7, 2019 · 6 comments · Fixed by #12015

Comments

@Aaron-Bird
Copy link

Aaron-Bird commented Apr 7, 2019

Version

2.6.10

Reproduction link

https://codepen.io/aaronbird/pen/JVRKwa

Steps to reproduce

I wrote a demo:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>demo</title>
    <style>
      .link {
        cursor: pointer;
        user-select: none;
      }
    </style>
  </head>
  <body>
    <script src="https://unpkg.com/vue/dist/vue.js"></script>

    <div id="app">
      <transition>
        <keep-alive include="foo">
          <component :is="target" @change="onChange"></component>
        </keep-alive>
      </transition>
    </div>
    <script>
      const Foo = {
        name: "foo",
        template: `<div class="link" @click="$emit('change', 'bar')">Go to Bar</div>`
      };
      const Bar = {
        name: "bar",
        template: `<div class="link" @click="$emit('change', 'foo')">Go to Foo</div>`
      };
      Vue.component("foo", Foo);
      Vue.component("bar", Bar);
      const app = new Vue({
        data: {
          target: "foo"
        },
        methods: {
          onChange(target) {
            this.target = target;
          }
        }
      }).$mount("#app");
    </script>
  </body>
</html>

The debugging process is as follows:
1 Click "Collect garbage" and "Take heap snapshot"(snapshot 1)
2 Click the routing button on the left 10 times, then click "Collect garbage" and "Take heap snapshot"(snapshot 2)
3 Click the routing button on the left 10 times, then click "Collect garbage" and "Take heap snapshot"(snapshot 3)

The generated "snapshot" is as follows:

snapshot 1:

snapshot 2:

snapshot 3:

After clicking 100 times:

VueComponent is not being recycled, is this a bug?

What is expected?

Why is this happening, is this a bug?

What is actually happening?

Component will not be cleared when switching components.

@posva posva added the bug label Apr 8, 2019
@dejour
Copy link
Contributor

dejour commented Apr 10, 2019

I will take a look this.

@dejour
Copy link
Contributor

dejour commented Apr 13, 2019

All component is retained by cached vnode’s parent,if we delete parent. then components are recycled.Will dig more

@sprocket99
Copy link

I also have a memory leak issue, please see : bootstrap-vue/bootstrap-vue#4214

I tried to make a jsfiddle but not sure how to replicate the caching behaviour.

@sky8ez
Copy link

sky8ez commented Jan 6, 2020

Hey, is there any news? is this updates already merged to master branch ? I have the same problem.

@kadet1090
Copy link

I'd really love to see any update on this issue - there is PR but it seems dead?

@lvjiaxuan
Copy link

It didn't fixed. Oh m g.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment