From 9dc03854056e766f7beaf03a89c7409f34607d8b Mon Sep 17 00:00:00 2001 From: yk3372 Date: Thu, 25 May 2017 02:46:53 -0700 Subject: [PATCH] fix memory leak Summary: Signed-off-by: yk3372 What existing problem does the pull request solve? ViewManagersPropertyCache, ViewManagerPropertyUpdater static field not release when ReactInstanceManager called destroy. I use this url to integrate RN: [http://facebook.github.io/react-native/docs/integration-with-existing-apps.html](http://facebook.github.io/react-native/docs/integration-with-existing-apps.html) and in Activity's onDestroy function add the follow code to release RN: ```java mReactInstanceManager.destroy(); mReactInstanceManager = null; ``` and then when I exit activity, find the static field not release. the follow is screen shot: before: ![2017-05-23 17 41 16](https://cloud.githubusercontent.com/assets/1514899/26350318/53ea250c-3fe5-11e7-8eda-a0dcc20ba4f6.jpg) after: ![2017-05-23 17 38 49](https://cloud.githubusercontent.com/assets/1514899/26350329/5e5b273e-3fe5-11e7-9b0b-a8b0e044abf3.jpg) Closes https://github.com/facebook/react-native/pull/14172 Differential Revision: D5128834 Pulled By: javache fbshipit-source-id: 657763fa21fd8826b4060f9a17e7f35f0e1e04d3 --- .../java/com/facebook/react/uimanager/UIManagerModule.java | 1 + .../react/uimanager/ViewManagerPropertyUpdater.java | 6 ++++++ .../facebook/react/uimanager/ViewManagersPropertyCache.java | 5 +++++ 3 files changed, 12 insertions(+) diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModule.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModule.java index e173b0795..ecdfd2837 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModule.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModule.java @@ -149,6 +149,7 @@ public class UIManagerModule extends ReactContextBaseJavaModule implements getReactApplicationContext().unregisterComponentCallbacks(mMemoryTrimCallback); YogaNodePool.get().clear(); + ViewManagerPropertyUpdater.clear(); } private static Map createConstants( diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewManagerPropertyUpdater.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewManagerPropertyUpdater.java index 363c50a0a..47d9ecf1c 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewManagerPropertyUpdater.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewManagerPropertyUpdater.java @@ -30,6 +30,12 @@ public class ViewManagerPropertyUpdater { new HashMap<>(); private static final Map, ShadowNodeSetter> SHADOW_NODE_SETTER_MAP = new HashMap<>(); + public static void clear() { + ViewManagersPropertyCache.clear(); + VIEW_MANAGER_SETTER_MAP.clear(); + SHADOW_NODE_SETTER_MAP.clear(); + } + public static void updateProps( T manager, V v, diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewManagersPropertyCache.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewManagersPropertyCache.java index 43d2509de..cfdd34be2 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewManagersPropertyCache.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewManagersPropertyCache.java @@ -28,6 +28,11 @@ import com.facebook.react.uimanager.annotations.ReactPropGroup; private static final Map> CLASS_PROPS_CACHE = new HashMap<>(); private static final Map EMPTY_PROPS_MAP = new HashMap<>(); + public static void clear() { + CLASS_PROPS_CACHE.clear(); + EMPTY_PROPS_MAP.clear(); + } + /*package*/ static abstract class PropSetter { protected final String mPropName;