Severe memory leak affecting fetch(), iOS Release Mode 0.59.0-rc.3, 0.58.6, 0.57.8
See original GitHub issue🐛 Bug Report
Every call to fetch()
uses memory and does not release it. The larger the fetch response, the more memory leaked.
- I’ve confirmed that this is happening in 0.57.8, 0.58.6, and 0.59.0-rc.3.
- I’ve tried this with both
node-fetch
andwhatwg-fetch
and it happens using both libraries. - It is not isolated to
response.blob()
. It affects all types of responses. - It happens with both Release and Debug.
- It happens with raw
XMLHttpRequest
as well asfetch
. - I can confirm that it’s happening on a (real) iPhone X with iOS 12.1.4 and the Simulator for an iPhone 8 with iOS 12.1.
Comparing memory snapshots in Safari found no difference in size even while the Chrome/Xcode memory profiles showed dramatic increases in memory. I’m not great at debugging memory leaks so I could be wrong but I suspect that means it might be on the native side and not on the JS side.
To Reproduce
I’ve created an example repo to reproduce the error in 0.59.0-rc.3: https://github.com/cjroth/react-native-fetch-memory-leak. You can copy the App.js and see that it happens in previous versions as well.
Expected Behavior
After each fetch() call that is no longer referenced, the memory should return to what it was previously.
Code Example
https://github.com/cjroth/react-native-fetch-memory-leak
Environment
React Native Environment Info:
System:
OS: macOS 10.14.1
CPU: (4) x64 Intel(R) Core(TM) i7-4650U CPU @ 1.70GHz
Memory: 16.96 MB / 8.00 GB
Shell: 5.3 - /bin/zsh
Binaries:
Node: 11.10.0 - /usr/local/bin/node
Yarn: 1.13.0 - /usr/local/bin/yarn
npm: 6.8.0 - /usr/local/bin/npm
Watchman: 4.9.0 - /usr/local/bin/watchman
SDKs:
iOS SDK:
Platforms: iOS 12.1, macOS 10.14, tvOS 12.1, watchOS 5.1
IDEs:
Xcode: 10.1/10B61 - /usr/bin/xcodebuild
npmPackages:
react: 16.8.3 => 16.8.3
react-native: 0.59.0-rc.3 => 0.59.0-rc.3
npmGlobalPackages:
react-native-cli: 2.0.1
react-native-git-upgrade: 0.2.7
react-native-rename: 2.4.0
Issue Analytics
- State:
- Created 5 years ago
- Reactions:13
- Comments:22 (2 by maintainers)
Top GitHub Comments
I think I’ve fixed it. Time to make my first PR into RN.
I found that the RCTNetworkTasks were not de-allocating, and that RCTBlobManager.mm was holding onto it’s blobs (NSData) forever after telling the RCTNetworking coordination code about the response.
I was able to reproduce using the iOS simulator and a variant of @cjroth s code with a five mb test file here