Closed abhaynpai closed 3 years ago
@abhaynpai this is very scary. plz fix it.
Just notice you didn't do super.onCreate(null) in MainApplication.java. Not sure if this is the reason.
Hey @jp928
Even after adding super.onCreate(null)
in MainApplication.java you can observe the memory leak.
I am unsure on how to fix it. Do you have any idea on the potential root cause for this memory leak?
I feel like it might be related to this issue perhaps: https://github.com/react-navigation/react-navigation/issues/7078
@omaryoussef - I think the it is somewhat related but not exactly. This issue highlights the actual issue with native navigation + screens.
If you disable enableScreens
and run the exact same test then you will not be able to see the memory leak.
It's the same for me! on my situation, I was using too many scenes in the same stack then get a memory leak issue. Anyway, I did try to disable enableScreen()
and try it again. The memory leak issue is gone but I get the very slow animation...
I think it's have a problem who can be to fixing or explain?
I know how we can recreate the issue but I am unsure on what exactly is causing this memory leak.
Same issue, not sure if it's a good idea to upgrade to 3.0.0 with this still happening (as the latest release enables screens by default)
I'm having this bug too. It's a severe problem please check it.
The behavior described by the tools as a leak is the consequence of keeping the ScreenFragment
s in the memory. It is done like this because, in react-native
, we cannot destroy and then make new views by restoring the state of the Fragment
, since each view has its reactTag
etc. The behavior is shown as a leak due to heuristics of the leak detector tools, which say that if onDestroy
was called on a Fragment
, then the reference to it should not be kept anywhere, but, as mentioned above, it is not applicable to react-native
apps, since we do not recreate the views of the Fragment
, but rather
call remove
on the them when they become invisible and then add
them back on the Screen
becoming visible with the same Screen
attached to it.
I hope this resolves the issue, so I will close it since I don't think we can do much more about it. If you have any questions or can propose other solutions, please write here and I can reopen it.
I've profiled the Navigation router and it doesn’t show any memory leaks. The Navigation router uses Android's native back stack to manage the scenes. Android doesn't call onDestroy
on a Fragment
in the back stack until it's popped and the pop animation has completed.
@grahammendick using back stack can be a way to go, it is even implemented in the RNScreens, but there were problems with integrating them with React Navigation iirc. Does this approach have benefits other than just not calling this lifecycle method on the Fragment
, which we are not using at the moment?
@WoLewicki A couple of benefits that spring to mind
The behavior described by the tools as a leak is the consequence of keeping the
ScreenFragment
s in the memory. It is done like this because, inreact-native
, we cannot destroy and then make new views by restoring the state of theFragment
, since each view has itsreactTag
etc. The behavior is shown as a leak due to heuristics of the leak detector tools, which say that ifonDestroy
was called on aFragment
, then the reference to it should not be kept anywhere, but, as mentioned above, it is not applicable toreact-native
apps, since we do not recreate the views of theFragment
, but rather callremove
on the them when they become invisible and thenadd
them back on theScreen
becoming visible with the sameScreen
attached to it.I hope this resolves the issue, so I will close it since I don't think we can do much more about it. If you have any questions or can propose other solutions, please write here and I can reopen it.
I found that Screen instance keep the reference of ScreenFragment and also ScreenFragment instance keep the reference of Screen in java source code.Could it cause memory leak?
@zoyopo the references on both sides are nulled when the Screen is removed from React view hierarchy, you can see it when going back, the memory is freed then.
I made two changes -
Description
One can observe retained memory while moving across different screens in the application. Even if you have one single stack with 3 different pages, you can observer a memory leak there. I have created a sample project to reproduce this issue. The link is given below
https://github.com/abhaynpai/rn-screens-leak
Screenshots
This is a YouTube video showcasing the leak in the project.
<img src="https://img.youtube.com/vi/_xtXRnA-vEE/0.jpg" alt="IMAGE ALT TEXT HERE" width="240" height="180" />
Steps To Reproduce
The steps are given in this GitHub link - https://github.com/abhaynpai/rn-screens-leak
Expected behavior
No memory leak should be displayed while moving across page.
Actual behavior
While moving between pages you can observe multiple memory leaks.
Snack or minimal code example
Package versions