У меня есть обратный вызов JNI:
void callback(Data *data, char *callbackName){
JNIEnv *env;
jvm->AttachCurrentThread((void **)&env, NULL);
/* start useful code*/
/* end useful code */
jvm->DetachCurrentThread();
}
Когда я запускаю его так (пустой полезный код), я получаю утечку памяти.Если я закомментирую весь метод, утечки нет.Как правильно прикреплять / отсоединять потоки?
Мое приложение обрабатывает звуковые данные в реальном времени, поэтому потоки, отвечающие за обработку данных, должны быть выполнены как можно скорее, чтобы быть готовыми к другому пакету.Поэтому для этих обратных вызовов я создаю новые темы.Каждую секунду их десятки или даже сотни, они присоединяются к JVM, вызывают функцию обратного вызова, которая перерисовывает граф, отсоединяет и умирает.Это правильный способ сделать это?Как справиться с утечкой памяти?
РЕДАКТИРОВАТЬ: опечатка
ОК Я создал необходимый минимальный код:
package test;
public class Start
{
public static void main(String[] args) throws InterruptedException{
System.loadLibrary("Debug/JNITest");
start();
}
public static native void start();
}
и
#include <jni.h>
#include <Windows.h>
#include "test_Start.h"
JavaVM *jvm;
DWORD WINAPI attach(__in LPVOID lpParameter);
JNIEXPORT void JNICALL Java_test_Start_start(JNIEnv *env, jclass){
env->GetJavaVM(&jvm);
while(true){
CreateThread(NULL, 0, &(attach), NULL, 0, NULL);
Sleep(10);
}
}
DWORD WINAPI attach(__in LPVOID lpParameter){
JNIEnv *env;
jvm->AttachCurrentThread((void **)&env, NULL);
jvm->DetachCurrentThread();
return 0;
}
и когда я запускаю профилировщик VisualJM, я получаю обычный пилообразный паттерн, утечки нет.Использование кучи достигло максимума около 5 МБ.Однако наблюдение за проводником процессов действительно показывает странное поведение: память медленно растет и растет, 4K в секунду в течение минуты или около того, а затем внезапно вся эта выделенная память падает.Эти отбрасывания не соответствуют сбору мусора (они происходят реже и освобождают меньше памяти, чем у пиломатериалов в профилировщике).
Поэтому я бы лучше посоветовал, что это некое поведение ОС, обрабатывающее десятки тысяч миллисекунд.жил темы.У какого-нибудь гуру есть объяснение этому?