Skip to content

Commit be00676

Browse files
committed
delete local refs to help memory issues
1 parent 7043fe5 commit be00676

4 files changed

Lines changed: 29 additions & 5 deletions

File tree

src/javaObject.cpp

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@
3030
jclass methodClazz = env->FindClass("java/lang/reflect/Method");
3131
jmethodID method_getName = env->GetMethodID(methodClazz, "getName", "()Ljava/lang/String;");
3232
for(std::list<jobject>::iterator it = methods.begin(); it != methods.end(); it++) {
33-
std::string methodNameStr = javaToString(env, (jstring)env->CallObjectMethod(*it, method_getName));
33+
jstring methodNameJava = (jstring)env->CallObjectMethod(*it, method_getName);
34+
std::string methodNameStr = javaToString(env, methodNameJava);
3435

3536
v8::Handle<v8::String> methodName = v8::String::New(methodNameStr.c_str());
3637
v8::Local<v8::FunctionTemplate> methodCallTemplate = v8::FunctionTemplate::New(methodCall, methodName);
@@ -39,16 +40,23 @@
3940
v8::Handle<v8::String> methodNameSync = v8::String::New((methodNameStr + "Sync").c_str());
4041
v8::Local<v8::FunctionTemplate> methodCallSyncTemplate = v8::FunctionTemplate::New(methodCallSync, methodName);
4142
javaObjectObj->Set(methodNameSync, methodCallSyncTemplate->GetFunction());
43+
44+
env->DeleteLocalRef(methodNameJava);
45+
env->DeleteLocalRef(*it);
4246
}
4347

44-
self->m_fields = javaReflectionGetFields(env, self->m_class);
48+
std::list<jobject> fields = javaReflectionGetFields(env, self->m_class);
4549
jclass fieldClazz = env->FindClass("java/lang/reflect/Field");
4650
jmethodID field_getName = env->GetMethodID(fieldClazz, "getName", "()Ljava/lang/String;");
47-
for(std::list<jobject>::iterator it = self->m_fields.begin(); it != self->m_fields.end(); it++) {
48-
std::string fieldNameStr = javaToString(env, (jstring)env->CallObjectMethod(*it, field_getName));
51+
for(std::list<jobject>::iterator it = fields.begin(); it != fields.end(); it++) {
52+
jstring fieldNameJava = (jstring)env->CallObjectMethod(*it, field_getName);
53+
std::string fieldNameStr = javaToString(env, fieldNameJava);
4954

5055
v8::Handle<v8::String> fieldName = v8::String::New(fieldNameStr.c_str());
5156
javaObjectObj->SetAccessor(fieldName, fieldGetter, fieldSetter);
57+
58+
env->DeleteLocalRef(fieldNameJava);
59+
env->DeleteLocalRef(*it);
5260
}
5361

5462
return scope.Close(javaObjectObj);
@@ -105,6 +113,9 @@ JavaObject::~JavaObject() {
105113
InstanceMethodCallBaton* baton = new InstanceMethodCallBaton(self->m_java, self, method, methodArgs, callback);
106114
baton->run();
107115

116+
env->DeleteLocalRef(methodArgs);
117+
env->DeleteLocalRef(method);
118+
108119
END_CALLBACK_FUNCTION("\"Method '" << methodNameStr << "' called without a callback did you mean to use the Sync version?\"");
109120
}
110121

src/javaObject.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ class JavaObject : public node::ObjectWrap {
3232
Java* m_java;
3333
jobject m_obj;
3434
jclass m_class;
35-
std::list<jobject> m_fields;
3635
};
3736

3837
#endif

src/methodCallBaton.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,8 @@ void InstanceMethodCallBaton::execute(JNIEnv *env) {
136136

137137
jobject result = env->CallObjectMethod(m_method, method_invoke, m_javaObject->getObject(), m_args);
138138

139+
env->DeleteLocalRef(methodClazz);
140+
139141
jthrowable err = env->ExceptionOccurred();
140142
if(err) {
141143
m_error = (jthrowable)env->NewGlobalRef(err);
@@ -145,6 +147,7 @@ void InstanceMethodCallBaton::execute(JNIEnv *env) {
145147
}
146148

147149
m_result = env->NewGlobalRef(result);
150+
env->DeleteLocalRef(result);
148151
}
149152

150153
NewInstanceBaton::NewInstanceBaton(

src/utils.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ std::list<jobject> javaReflectionGetMethods(JNIEnv *env, jclass clazz) {
2626
}
2727
results.push_back(method);
2828
}
29+
env->DeleteLocalRef(methodObjects);
2930

3031
return results;
3132
}
@@ -48,6 +49,7 @@ std::list<jobject> javaReflectionGetFields(JNIEnv *env, jclass clazz) {
4849
}
4950
results.push_back(field);
5051
}
52+
env->DeleteLocalRef(fieldObjects);
5153

5254
return results;
5355
}
@@ -264,7 +266,9 @@ jobjectArray v8ToJava(JNIEnv* env, const v8::Arguments& args, int start, int end
264266
for(int i=start; i<end; i++) {
265267
jobject val = v8ToJava(env, args[i]);
266268
env->SetObjectArrayElement(results, i - start, val);
269+
env->DeleteLocalRef(val);
267270
}
271+
env->DeleteLocalRef(clazz);
268272

269273
return results;
270274
}
@@ -405,8 +409,11 @@ jobjectArray javaObjectArrayToClasses(JNIEnv *env, jobjectArray objs) {
405409
} else {
406410
jclass objClazz = env->GetObjectClass(elem);
407411
env->SetObjectArrayElement(results, i, objClazz);
412+
env->DeleteLocalRef(objClazz);
408413
}
414+
env->DeleteLocalRef(elem);
409415
}
416+
env->DeleteLocalRef(clazzClazz);
410417
return results;
411418
}
412419

@@ -418,6 +425,10 @@ jobject javaFindMethod(JNIEnv *env, jclass clazz, std::string& methodName, jobje
418425
jobjectArray methodArgClasses = javaObjectArrayToClasses(env, methodArgs);
419426
jobject method = env->CallStaticObjectMethod(methodUtilsClazz, methodUtils_getMatchingAccessibleMethod, clazz, methodNameJavaStr, methodArgClasses);
420427

428+
env->DeleteLocalRef(methodUtilsClazz);
429+
env->DeleteLocalRef(methodNameJavaStr);
430+
env->DeleteLocalRef(methodArgClasses);
431+
421432
return method;
422433
}
423434

0 commit comments

Comments
 (0)