JNI, я не могу найти код места утечки памяти - PullRequest
0 голосов
/ 27 сентября 2018

Вот код стороны jni cpp:

JNIEXPORT jfloatArray JNICALL Java_server_framework_chat_similarity_TextMatcher_xgboostBatchScore
      (JNIEnv *env, jobject obj, jlong long_h, jobject q1, jobject q2){

        jclass ret = env->FindClass("java/util/ArrayList");
        jclass java_util_ArrayList = static_cast<jclass>(env->NewGlobalRef(ret));
        jmethodID java_util_ArrayList_ = env->GetMethodID(java_util_ArrayList, "<init>", "(I)V");
        jmethodID java_util_ArrayList_size = env->GetMethodID (java_util_ArrayList, "size", "()I");
        jmethodID java_util_ArrayList_get = env->GetMethodID(java_util_ArrayList, "get", "(I)Ljava/lang/Object;");
        jmethodID java_util_ArrayList_add = env->GetMethodID(java_util_ArrayList, "add", "(Ljava/lang/Object;)Z");

        jint len = env->CallIntMethod(q1, java_util_ArrayList_size);
        vector<string> result1;
        result1.reserve(len);
        for (jint i=0; i<len; i++) {
          jstring element = static_cast<jstring>(env->CallObjectMethod(q1, java_util_ArrayList_get, i));
          const char* pchars = env->GetStringUTFChars(element, NULL);
          result1.push_back(pchars);
          env->ReleaseStringUTFChars(element, pchars);
          env->DeleteLocalRef(element);
        }  

        jint len2 = env->CallIntMethod(q2, java_util_ArrayList_size);
        vector<string> result2;
        result2.reserve(len2);
        for (jint i=0; i<len2; i++) {
          jstring element = static_cast<jstring>(env->CallObjectMethod(q2, java_util_ArrayList_get, i));
          const char* pchars = env->GetStringUTFChars(element, NULL);
          result2.push_back(pchars);
          env->ReleaseStringUTFChars(element, pchars);
          env->DeleteLocalRef(element);
        }  

        HANDLE_XGBOOST_SESSION h = (HANDLE_XGBOOST_SESSION)long_h;
        vector<float> scores = get_xgboost_batch_score(h, result1, result2);

        jfloatArray result = env->NewFloatArray(len);
        jfloat fill[len];
        for (int i = 0; i < scores.size(); i++) {
             fill[i] = scores[i]; 
        }
        env->SetFloatArrayRegion(result, 0, len, fill);

        env->DeleteLocalRef(ret);
        env->DeleteGlobalRef(java_util_ArrayList);
        env->DeleteLocalRef(q1);
        env->DeleteLocalRef(q2);
        return result;
      }

Смысл get_xgboost_batch_score заключается в следующем: получить совпадение для двух текстов в пакете.

Я запускаю 5 простых javaтестовые программы, содержащие цикл while для запуска этого кода.

Монитор памяти показывает, что объем памяти уменьшается примерно на 50 М за 30 минут.

Но я стараюсь изо всех сил и не могу найти код ошибки.

Я использую valgrind для отслеживания Java-программы и нахожу:

==13595== Invalid write of size 4
==13595==    at 0x80CC692: ???
==13595==    by 0x80B84E6: ???
==13595==    by 0x64CB649: ??? (in /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.181-3.b13.el7_5.x86_64/jre/lib/amd64/server/libjvm.so)
==13595==    by 0x64DE14E: ??? (in /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.181-3.b13.el7_5.x86_64/jre/lib/amd64/server/libjvm.so)
==13595==    by 0x64E92B2: ??? (in /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.181-3.b13.el7_5.x86_64/jre/lib/amd64/server/libjvm.so)
==13595==    by 0x767A3C5A: JNIEnv_::CallIntMethod(_jobject*, _jmethodID*, ...) (jni.h:987)

Является ли CallIntMethod ошибкой?

1 Ответ

0 голосов
/ 29 сентября 2018

Нет утечки памяти.

Память не уменьшается примерно через 5 часов.

no memory leak

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...