You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Angular v10 - Excessive memory consumption at build #18087
Since upgrading to Angular 10, the build process takes an excessive amount of RAM, making it impossible to deploy on Heroku (build fails with OOM error).
For the same code, just upgraded:
Angular 9 memory consumption at prod build: ~2 to 2.5 Gb.
Angular 10 memory consumption at prod build: ~8 to 9 Gb.
Heroku limit is 2.5 Gb, so it fails with Angular 10.
On my local computer, with no such memory limit, the build works ok.
🐞 bug report
Is this a regression?
Yes
Description
The memory spike seems to occur after ngcc has finished its pre-compilation steps es2015 to esm2015 and starts actual compilation of the code.
There was a memory leak in v10 with incremental compilations which we have since tracked down and fixed (see #18034) but yours appears to be a single compilation. As such, I suspect it's a different cause but we'd need more information to be able to investigate.
Ah yes.
What kind of information would be useful? I'm not familiar with debugging memory issues in a javascript setting.
Fyi, I use a custom builder to pre-compile *.graphql files, but I don't think updating to angular v10 would change much on that side. Is there a way to check (hard to disable completely since I need the files to be pre-compiled)?
I can have a look if you are able to share a repo (privately is okay). Otherwise, the easiest way to debug memory issues is to attach a debugger (such as ndb) to get insight into the memory consumption of the processes, from which you can also create heaps dumps. For very large heaps it may be problematic to inspect the dumps, as it takes quite a bit of memory. From a single heap dump it's not always clear whether there's an actual leak (as it's just a single snapshot and spotting leaks may require monitoring over time) but it should already give quite a bit of insight.
Alright, I found the culprit., and it was not what I would have ever expected.
With the migration to Angular 10, the .browserlistrc was changed in a way where differential loading is no longer enabled (as none of the browsers that require ES5 are included in the browsers list). When differential loading is enabled, the CLI uses a pipeline that works a bit differently in certain areas, one of which is how it deals with asset files. With differential loading disabled, copying assets is done using the copy-webpack-plugin which is currently affected by a bug that's been fixed in webpack/copy-webpack-plugin#507, but that's not yet been released. Without the bug fix, the plugin is invoked for each Webpack compilation, of which there are 121 in the reproduction (I don't know why it's that many). Each of those loads ~58MB of asset files into memory, accounting for some 7 GB of memory usage 😱
I applied the patch in webpack/copy-webpack-plugin#507 locally and it reduces memory usage by 120 times 58 MB, bringing it down to the levels pre-upgrade.
Given that there's no copy-webpack-plugin release yet, the simplest workaround for now would be to revert the changes to the .browserlistrc file to regain 7GB of RAM. And yes, I also find that hard to believe!
Angular 9 is also affected here since #17867 (released 3 weeks ago in CLI 9.1.8), as the upgrade to v6 of copy-webpack-plugin introduces the regression. It's only because the browserlist configuration triggered differential loading that it didn't result in memory issues since 9.1.8.
Reacted by Keen, Michael Monerau, Marcel Hendrich, Rui Marques and Michael S
(Off-topic: Any tip on how I could investigate what seems to be the excessive number of webpack compiles?)
I am not really familiar with Webpack's compilation model so I can't judge if that number is excessive. If every compilation consumes 60MB of RAM then surely it's a problem, but now that that has been addressed I wouldn't worry about it.
Those aren't actually excessive compiles. Each component stylesheet currently needs to be processed via a child compilation to allow the full processing pipeline defined within webpack to be used. This is similar to the behavior of the html-webpack-plugin or the worker-plugin.
I just upgraded to Angular v10.0.11 in my project where I was using Angular v9.1, I followed the official upgrade guide. I am using docker to build the project for production, and kubernetes to run it in development mode with the development server.
In my docker container to build with ng build --prod had to increase the memory limit for docker from 2GB to 3GB otherwise the build would crash with "JavaScript heap out of memory". The same for kubernetes I had to increase the pod memory limit to 3.5GB for it to work when running ng serve for development.
In Angular v9 it was bad but in v10 it is worse... Could this issue be please reopened?
Reacted by Witold Kupś, Zack Yang, Szymon and milanaivanchenko
Do you have lots of assets? For me, decreasing the size of assets reduced the memory footprint at build stage. Not really a stable solution though, it's more finger crossing than solving.
angular-automatic-lock-bot commented on Sep 25, 2020
Activity
[-]Excessive memory consumption at build[/-][+]Angular v10 - Excessive memory consumption at build[/+]charanseeram commentedon Jun 30, 2020
JoostK commentedon Jun 30, 2020
There was a memory leak in v10 with incremental compilations which we have since tracked down and fixed (see #18034) but yours appears to be a single compilation. As such, I suspect it's a different cause but we'd need more information to be able to investigate.
qortex commentedon Jun 30, 2020
Ah yes.
What kind of information would be useful? I'm not familiar with debugging memory issues in a javascript setting.
Fyi, I use a custom builder to pre-compile
*.graphqlfiles, but I don't think updating to angular v10 would change much on that side. Is there a way to check (hard to disable completely since I need the files to be pre-compiled)?JoostK commentedon Jun 30, 2020
I can have a look if you are able to share a repo (privately is okay). Otherwise, the easiest way to debug memory issues is to attach a debugger (such as ndb) to get insight into the memory consumption of the processes, from which you can also create heaps dumps. For very large heaps it may be problematic to inspect the dumps, as it takes quite a bit of memory. From a single heap dump it's not always clear whether there's an actual leak (as it's just a single snapshot and spotting leaks may require monitoring over time) but it should already give quite a bit of insight.
qortex commentedon Jun 30, 2020
Thanks that's awesome, just invited you to the private repo. Let's follow up the discussion there.
JoostK commentedon Jun 30, 2020
Thank you, I will have a look later today.
JoostK commentedon Jun 30, 2020
Alright, I found the culprit., and it was not what I would have ever expected.
With the migration to Angular 10, the
.browserlistrcwas changed in a way where differential loading is no longer enabled (as none of the browsers that require ES5 are included in the browsers list). When differential loading is enabled, the CLI uses a pipeline that works a bit differently in certain areas, one of which is how it deals with asset files. With differential loading disabled, copying assets is done using thecopy-webpack-pluginwhich is currently affected by a bug that's been fixed in webpack/copy-webpack-plugin#507, but that's not yet been released. Without the bug fix, the plugin is invoked for each Webpack compilation, of which there are 121 in the reproduction (I don't know why it's that many). Each of those loads ~58MB of asset files into memory, accounting for some 7 GB of memory usage 😱I applied the patch in webpack/copy-webpack-plugin#507 locally and it reduces memory usage by 120 times 58 MB, bringing it down to the levels pre-upgrade.
Given that there's no
copy-webpack-pluginrelease yet, the simplest workaround for now would be to revert the changes to the.browserlistrcfile to regain 7GB of RAM. And yes, I also find that hard to believe!Angular 9 is also affected here since #17867 (released 3 weeks ago in CLI 9.1.8), as the upgrade to v6 of
copy-webpack-pluginintroduces the regression. It's only because the browserlist configuration triggered differential loading that it didn't result in memory issues since 9.1.8.6 remaining items
alan-agius4 commentedon Jun 30, 2020
No longer blocked on upstream since a release containing the mentioned fix has been cut.
https://github.com/webpack-contrib/copy-webpack-plugin/releases/tag/v6.0.3
qortex commentedon Jul 1, 2020
That is some very impressive investigation! Thanks a lot for looking into it that fast and solving it.
I have quite a bunch of assets indeed, didn't compress / put them in an external bucket yet. I'll report it's working when the fix is released.
(Off-topic: Any tip on how I could investigate what seems to be the excessive number of webpack compiles?)
JoostK commentedon Jul 1, 2020
I am not really familiar with Webpack's compilation model so I can't judge if that number is excessive. If every compilation consumes 60MB of RAM then surely it's a problem, but now that that has been addressed I wouldn't worry about it.
clydin commentedon Jul 1, 2020
Those aren't actually excessive compiles. Each component stylesheet currently needs to be processed via a child compilation to allow the full processing pipeline defined within webpack to be used. This is similar to the behavior of the
html-webpack-pluginor theworker-plugin.dhrn commentedon Jul 21, 2020
ng serve takes 2.3 GB ... any clue?
Azbesciak commentedon Aug 14, 2020
Guys, I just updated from 9.1.9 to 10.0.9 and ....
before everything was fine
iencodev commentedon Aug 24, 2020
I just upgraded to Angular v10.0.11 in my project where I was using Angular v9.1, I followed the official upgrade guide. I am using docker to build the project for production, and kubernetes to run it in development mode with the development server.
In my docker container to build with
ng build --prodhad to increase the memory limit for docker from 2GB to 3GB otherwise the build would crash with "JavaScript heap out of memory". The same for kubernetes I had to increase the pod memory limit to 3.5GB for it to work when runningng servefor development.In Angular v9 it was bad but in v10 it is worse... Could this issue be please reopened?
Azbesciak commentedon Aug 25, 2020
Yeah, kinda funny - you said that ng10 was nothing else but a tooling... and now we need an excavator instead of a shovel
qortex commentedon Aug 25, 2020
Do you have lots of assets? For me, decreasing the size of assets reduced the memory footprint at build stage. Not really a stable solution though, it's more finger crossing than solving.
angular-automatic-lock-bot commentedon Sep 25, 2020
This issue has been automatically locked due to inactivity.
Please file a new issue if you are encountering a similar or related problem.
Read more about our automatic conversation locking policy.
This action has been performed automatically by a bot.