vuejs / apollo

🚀 Apollo/GraphQL integration for VueJS
http://apollo.vuejs.org
MIT License
6.02k stars 522 forks source link

@vue/apollo-option - memory leak on SSR render #1550

Closed amenella closed 1 month ago

amenella commented 5 months ago

Description

Hi,

We've encountered some memory leaks using @vue/apollo-option (through the related Nuxt 3 plugin : https://github.com/nuxt-modules/apollo).

After some debug we found that the context of following method is constantly increasing and seems never released:

My best call would be to first destroy the context then re-render, but this is only a feeling and I did not tried (on those lines).

This behaviour has only been seen on production (maybe due production build + traffic).

Here are some screenshot of Node.js debug mode on production, on which we can see that the memory allocation is constantly increasing: image

The line referred in previous screenshot :point_up: led us to those particular lines: image

Reproduction

Unfortunately I have no easy example to reproduce this issue (we are not even able to reproduce it with the same stack on a non-production environment...)

Expected behavior

No memory leak

Versions

vue - 3.3.11 @nuxtjs/apollo - 5.0.0-alpha.11 @apollo/client: 3.8.8 @vue/apollo-option: 4.0.0-beta.12 @vue/apollo-composable - 4.0.0-beta.12

Additional context

This issue seems related to some old ones (which should have fixed it):

  1. https://github.com/vuejs/apollo/issues/1424
  2. https://github.com/vuejs/apollo/issues/806

We also have a specific usage of apollo client within the Nuxt app using a specific mixin to allow update of endpoint at runtime using env var, which is highly inspired from https://github.com/nuxt-modules/apollo/issues/442#issuecomment-1431638100

Any help or hint would be appreciated, thanks a lot

deleteme commented 4 months ago

@amenella https://github.com/vuejs/apollo/pull/1553 this might help. Is it possible for you to try this branch out?

amenella commented 4 months ago

Hi @deleteme, thanks a lot for the suggestion! :pray:

I'll try to test this asap on a test environment, however like said in my original message, we have only been able to reproduce this on production for the moment

amenella commented 4 months ago

Hi again, I just tried with your suggestion, however I've got an error during the build on dev mode:

ERROR  Pre-transform error: Failed to resolve entry for package "@vue/apollo-option". The package may have incorrect main/module/exports specified in its package.json.

which lead to following Nuxt error:

image

I tried the suggestion using a yarn override in my package.json:

  "resolutions": {
    "@vue/apollo-option": "git+https://github.com/deleteme/vuejs-apollo.git#fix-memory-leak-in-vue-apollo-option-beforeCreate"
  }

the relaunching the dev mode (after reinstalling my deps): nuxt dev

I've also tried to manually build the deps (directly in my node_modules) by following the contribution guide but it leads to the same error.

am I missing something here?

deleteme commented 4 months ago

@amenella Sorry, I am not familiar with the build process in this repository. You can use yarn patch to replicate the changes from https://github.com/vuejs/apollo/pull/1553/files.

amenella commented 4 months ago

hi again @deleteme , we've just tested the fix (not in production though) and the memory usage seems stable with the fix! :raised_hands:

plus, looking at the code, changes seem good to me, however, I'm not maintainer in this project so this is not my word to say

thanks again for your time :pray:

amenella commented 4 months ago

Hi vuejs team! any news on integrating this? @Akryum perhaps? :pray: