Java_com_didi_hummer_core_engine_napi_jni_JSEngine_callFunction 内存泄漏

Abierto
#447 2 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
4/5
Tiempo estimado
3-5 días
Aptitud para principiantes
35/100
Tipo de issue
Error
Claridad
Bastante claro
Estado de actividad
Estancado
Stack tecnológico
android, cpp, java, javascript
Área
mobile

Línea de trabajo

Comienza en Java_com_didi_hummer_core_engine_napi_jni_JSEngine_callFunction y sigue el NAPI handle scope, el resultado de napi_call_function y la conversión de JSUtils::JsValueToJavaObject. Reproduce el caso de setInterval repetido y verifica que las llamadas repetidas ya no dejen retenidas referencias adicionales a JSValue o Promise.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

bug Needs: Triage 🔍

案例:
this.timer = setInterval(async () => {
console.log('每隔 1s 执行一次');
}, 1000);

每次执行JSValue都会增加一个。

extern "C"
JNIEXPORT jobject JNICALL
Java_com_didi_hummer_core_engine_napi_jni_JSEngine_callFunction(JNIEnv *env, jclass clazz, jlong js_context, jlong thisObj, jlong funcObj, jobjectArray params) {
auto globalEnv = JSUtils::toJsContext(js_context);

NAPIHandleScope handleScope;
napi_open_handle_scope(globalEnv, &handleScope);

NAPIValue jsThisObj = JSUtils::toJsValue(globalEnv, thisObj);
NAPIValue jsFuncObj = JSUtils::toJsValue(globalEnv, funcObj);
auto paramsCount = static_cast<int>(env->GetArrayLength(params));

if (jsFuncObj == nullptr) {
    return nullptr;
}

auto values = new NAPIValue[paramsCount];
for (int i = 0; i < paramsCount; i++) {
    jobject obj = env->GetObjectArrayElement(params, i);
    values[i] = JSUtils::JavaObjectToJsValue(globalEnv, obj);
    env->DeleteLocalRef(obj);
}

if (jsThisObj == nullptr) {
    jsThisObj = JSUtils::createJsUndefined(globalEnv);
}

NAPIValue result;
auto status = napi_call_function(globalEnv, jsThisObj, jsFuncObj, paramsCount, values, &result);
if (status == NAPIExceptionPendingException) {
    reportExceptionIfNeed(globalEnv);
    napi_close_handle_scope(globalEnv, handleScope);
    return nullptr;
}
delete[] values;

jobject r = JSUtils::JsValueToJavaObject(globalEnv, result, true);
napi_close_handle_scope(globalEnv, handleScope);
return r;

}
原因是每次调用 NAPIValue result; 都会返回一个Promise,导致JSUtils::JsValueToJavaObject(globalEnv, result, true)的使用做了强制+1,从而导致内存不释放

Lenguaje dominante
Objective-C
Estrellas
1.4k
Forks
186
Métricas de merge de PR
Sin PR fusionados en 30 d

Preparar el entorno

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de didi/Hummer

Todos los issues de didi/Hummer

Issues similares

Más issues de Objective-C

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.