Repository: incubator-weex Updated Branches: refs/heads/master dd60f6fd7 -> 2e9c22b84
[WEEX-411][Core] Fix memory leak due to return render time Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/ffddb376 Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/ffddb376 Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/ffddb376 Branch: refs/heads/master Commit: ffddb376eef6ccdca378cece481995af3e8e6e9a Parents: 8838d6c Author: miomin <[email protected]> Authored: Sat May 26 23:08:07 2018 +0800 Committer: miomin <[email protected]> Committed: Sat May 26 23:08:07 2018 +0800 ---------------------------------------------------------------------- .../bridge/impl/weexcore_impl_android.cpp | 58 ++++++++++++++++---- 1 file changed, 48 insertions(+), 10 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/ffddb376/weex_core/Source/android/bridge/impl/weexcore_impl_android.cpp ---------------------------------------------------------------------- diff --git a/weex_core/Source/android/bridge/impl/weexcore_impl_android.cpp b/weex_core/Source/android/bridge/impl/weexcore_impl_android.cpp index 039174e..8e206ed 100644 --- a/weex_core/Source/android/bridge/impl/weexcore_impl_android.cpp +++ b/weex_core/Source/android/bridge/impl/weexcore_impl_android.cpp @@ -38,6 +38,8 @@ jclass jWMBridgeClazz = nullptr; jmethodID jDoubleValueMethodId; jobject jThis; jobject jWMThis; +jlongArray jFirstScreenRenderTime = nullptr; +jlongArray jRenderFinishTime = nullptr; std::map<std::string, jobject> componentTypeCache; JStringCache refCache(2048); @@ -139,11 +141,17 @@ static void SetRenderContainerWrapContent(JNIEnv* env, jobject jcaller, jboolean } static jlongArray GetFirstScreenRenderTime(JNIEnv *env, jobject jcaller, jstring instanceId) { - jlongArray jRet = env->NewLongArray(3); + jlongArray jTemp = env->NewLongArray(3); RenderPage *page = RenderManager::GetInstance()->GetPage(jString2StrFast(env, instanceId)); - if (page == nullptr) - return jRet; + if (page == nullptr) { + if (jFirstScreenRenderTime != nullptr) { + env->DeleteGlobalRef(jFirstScreenRenderTime); + jFirstScreenRenderTime = nullptr; + } + jFirstScreenRenderTime = static_cast<jlongArray>(env->NewGlobalRef(jTemp)); + return jFirstScreenRenderTime; + } std::vector<long> temp = page->PrintFirstScreenLog(); @@ -152,17 +160,30 @@ static jlongArray GetFirstScreenRenderTime(JNIEnv *env, jobject jcaller, jstring ret[0] = temp[0]; ret[1] = temp[1]; ret[2] = temp[2]; - env->SetLongArrayRegion(jRet, 0, 3, ret); + env->SetLongArrayRegion(jTemp, 0, 3, ret); - return jRet; + if (jFirstScreenRenderTime != nullptr) { + env->DeleteGlobalRef(jFirstScreenRenderTime); + jFirstScreenRenderTime = nullptr; + } + jFirstScreenRenderTime = static_cast<jlongArray>(env->NewGlobalRef(jTemp)); + + env->DeleteLocalRef(jTemp); + return jFirstScreenRenderTime; } static jlongArray GetRenderFinishTime(JNIEnv *env, jobject jcaller, jstring instanceId) { - jlongArray jRet = env->NewLongArray(3); + jlongArray jTemp = env->NewLongArray(3); RenderPage *page = RenderManager::GetInstance()->GetPage(jString2StrFast(env, instanceId)); - if (page == nullptr) - return 0; + if (page == nullptr) { + if (jRenderFinishTime != nullptr) { + env->DeleteGlobalRef(jRenderFinishTime); + jRenderFinishTime = nullptr; + } + jRenderFinishTime = static_cast<jlongArray>(env->NewGlobalRef(jTemp)); + return jRenderFinishTime; + } std::vector<long> temp = page->PrintRenderSuccessLog(); @@ -171,9 +192,16 @@ static jlongArray GetRenderFinishTime(JNIEnv *env, jobject jcaller, jstring inst ret[0] = temp[0]; ret[1] = temp[1]; ret[2] = temp[2]; - env->SetLongArrayRegion(jRet, 0, 3, ret); + env->SetLongArrayRegion(jTemp, 0, 3, ret); + + if (jRenderFinishTime != nullptr) { + env->DeleteGlobalRef(jRenderFinishTime); + jRenderFinishTime = nullptr; + } + jRenderFinishTime = static_cast<jlongArray>(env->NewGlobalRef(jTemp)); - return jRet; + env->DeleteLocalRef(jTemp); + return jRenderFinishTime; } //Notice that this method is invoked from main thread. @@ -547,6 +575,16 @@ jint OnLoad(JavaVM *vm, void *reserved) { env->DeleteGlobalRef(jWXLogUtils); env->DeleteGlobalRef(jMapClazz); + if (jFirstScreenRenderTime != nullptr) { + env->DeleteLocalRef(jFirstScreenRenderTime); + jFirstScreenRenderTime = nullptr; + } + + if (jRenderFinishTime != nullptr) { + env->DeleteLocalRef(jRenderFinishTime); + jRenderFinishTime = nullptr; + } + for (auto iter = componentTypeCache.begin(); iter != componentTypeCache.end(); iter++) { if (iter->second != nullptr) { env->DeleteGlobalRef(iter->second);
