From b637ccffd856ba911c1527077cec3abff39035f5 Mon Sep 17 00:00:00 2001 From: Viorel Suman Date: Fri, 30 May 2014 16:51:07 +0300 Subject: [PATCH] Fixed VM memory leak in AudioSystem JNI interface The function android_media_AudioSystem_error_callback from AudioSystem JNI interface is using FindClass function but does not delete the reference created by VM in this function. By doing this call, VM will add a local reference in IndirectRefTable and it's the caller's job to delete this reference. By not doing this, everytime this callback is called, a new reference is added and never deleted. The effect is crashing the VM running system_server: E/dalvikvm( 3071): JNI ERROR (app bug): local reference table overflow (max=512) W/dalvikvm( 3071): JNI local reference table (0x732da288) dump: W/dalvikvm( 3071): Last 10 entries (of 512): W/dalvikvm( 3071): 511: 0x42a90008 java.lang.Class W/dalvikvm( 3071): 510: 0x4381fd90 android.view.KeyEvent W/dalvikvm( 3071): 509: 0x439b9808 android.view.KeyEvent W/dalvikvm( 3071): 508: 0x42d2fe18 java.lang.Class W/dalvikvm( 3071): 507: 0x42ad4298 java.lang.Class W/dalvikvm( 3071): 506: 0x42ad4298 java.lang.Class W/dalvikvm( 3071): 505: 0x42ad4298 java.lang.Class W/dalvikvm( 3071): 504: 0x42ad4298 java.lang.Class W/dalvikvm( 3071): 503: 0x42ad4298 java.lang.Class W/dalvikvm( 3071): 502: 0x42ad4298 java.lang.Class W/dalvikvm( 3071): Summary: W/dalvikvm( 3071): 510 of java.lang.Class (3 unique instances) W/dalvikvm( 3071): 2 of android.view.KeyEvent (2 unique instances) E/dalvikvm( 3071): Failed adding to JNI local ref table (has 512 entries) ... E/dalvikvm( 3071): VM aborting In this case, PID 3071 is system server. Change-Id: I0c113eb72256984854d59a3ccef11a8d23f96e79 Signed-off-by: Robert Chiras --- core/jni/android_media_AudioSystem.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/jni/android_media_AudioSystem.cpp b/core/jni/android_media_AudioSystem.cpp index a19d1119d93f6..42feab4e3a499 100644 --- a/core/jni/android_media_AudioSystem.cpp +++ b/core/jni/android_media_AudioSystem.cpp @@ -129,6 +129,8 @@ android_media_AudioSystem_error_callback(status_t err) env->CallStaticVoidMethod(clazz, env->GetStaticMethodID(clazz, "errorCallbackFromNative","(I)V"), check_AudioSystem_Command(err)); + + env->DeleteLocalRef(clazz); } static jint