question-mark
Stuck on an issue?

Lightrun Answers was designed to reduce the constant googling that comes with debugging 3rd party libraries. It collects links to all the places you might be looking at while hunting down a tough bug.

And, if you’re still stuck at the end, we’re happy to hop on a call to see how we can help out.

Leak in RCTNetwork module

See original GitHub issue

Environment

Environment:
  OS: macOS High Sierra 10.13.5
  Node: 6.11.1
  Yarn: 1.6.0
  npm: 3.10.10
  Watchman: 4.9.0
  Xcode: Not Found
  Android Studio: 2.3 AI-162.4069837

Packages: (wanted => installed)
  react: 16.3.1 => 16.3.1
  react-native: 0.55.4 => 0.55.4

Description

A simple fetch call like the one below is enough to make various parts of RCTNetwork pile up references and memory allocations via malloc and etc. When I say pile up, what I mean is that every GET call is actually malloc-ing and retaining some data that never goes away. Simulating a low memory warning in Instruments also doesn’t seem to get these references garbage collected away.

Reproducibility: 100%

  setInterval(() => {
    fetch('https://facebook.github.io/react-native/movies.json')
      .then((response) => response.json())
  }, 1000)
Screenshot 1

screen shot 2018-06-13 at 4 16 21 pm

Screenshot 2 screen shot 2018-06-15 at 9 25 24 pm
Screenshot 3 screen shot 2018-06-15 at 9 25 17 pm
Screenshot 4 screen shot 2018-06-15 at 9 25 05 pm

Some of the more obvious locations that I observed to be leaking:

TLDR: I’m not too familiar with the inner workings with RCTNetwork but the memory allocation seems to suggest that something funky is going on with the completionBlock which is leading to the retention of these references.

This is also a continuation of the conversation we had in #19169. @oNaiPs, you might be interested in this. 😄

Reproducible Demo

  1. Clone this basic RN project @ https://github.com/yinghang/react-native-leak
  2. Profile app with Instruments using Allocations
  3. Watch RCTNetwork related references pile up

Issue Analytics

  • State:closed
  • Created 5 years ago
  • Reactions:5
  • Comments:8 (4 by maintainers)

github_iconTop GitHub Comments

3reactions
Ashoatcommented, Jul 17, 2018

I’ve figured out a workaround for my case. I’m using lodash’s _cloneDeep to clone the response from fetch, which allows the original response to be garbage-collected. My release build is now stably using ~500MiB instead of leaking to 1400MiB in less than a minute.

Simplified version of my updated code:

const fetchResult = await fetch("http://domain.tld/path", input);
const text = await fetchResult.text();
const response = _cloneDeep(JSON.parse(text));

In my case, retaining the JSON.parse’d response prevented the entire network request from being garbage-collected. I was retaining most of the response because I build a Redux action out of it, and then cache the 20 most recent Redux actions in memory for debugging purposes. This normally doesn’t take that much memory on the JS thread; the issue is the network requests not being garbage-collected.

I think the React Native issue I am seeing concretely is that as of 0.55, retaining a JSON.parse’d network response prevents the corresponding network request from being garbage-collected. This issue is extant as of 0.56.

I don’t think this is the same issue as @yinghang initially reported, as their demo repo does not retain anything from the network request.

2reactions
Ashoatcommented, Jul 23, 2018

I’ve opened #20352 for my issue. It turns out downloading a specifically-formatted tiny JSON file can cause a much bigger memory leak.

Separately, I’m definitely able to confirm that OP’s issue is still occurring in 0.56.0. The memory leak is much smaller, but still significant.

Read more comments on GitHub >

github_iconTop Results From Across the Web

Spacewalks shelved as Russian ISS module ... - New Atlas
Astronauts and mission control on the ground are busy investigating a leak aboard the Russian Soyuz MS-22 spacecraft docked to the ...
Read more >
Solving Memory Leaks with React Native - Enquero
Memory leaks are a problem every developer has to face eventually. ... In React Native world each JS module scope is attached to...
Read more >
DM-TL (DIAGNOSIS MODULE - TANK LEAKAGE)
The DC Motor LDP ensures accurate fuel system leak detection for leaks as small as. 0.5mm (.020”). The pump contains an integral DC...
Read more >
Cosmonauts seal air leak in Russian module of ... - Space.com
Two Russian cosmonauts will drill holes and apply sealant to stop two cracks in one of the oldest modules of the International Space ......
Read more >
WATCH: Spacewalk at space station canceled after coolant ...
Planned spacewalk canceled after leak of coolant fluid from Soyuz ... to the space station's Nauka science module, according to NASA.
Read more >

github_iconTop Related Medium Post

No results found

github_iconTop Related StackOverflow Question

No results found

github_iconTroubleshoot Live Code

Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start Free

github_iconTop Related Reddit Thread

No results found

github_iconTop Related Hackernoon Post

No results found

github_iconTop Related Tweet

No results found

github_iconTop Related Dev.to Post

No results found

github_iconTop Related Hashnode Post

No results found