我有一个存储使用JNI在Java软件商店某个对象的C程序。 (有人问之前,请使用Java软件商店是这里的要求及我必须写在C客户端,将能够从这个存储区中添加和检索对象)。
我制作的节目,并试图增加大小1KB 100000对象。 但仅增加50000对象后我得到“内存不足”的消息(请注意,我打印这些“内存不足”的消息,每当我无法分配使用NewStringUTF和NewByteArray功能的新的字符串或字节数组)。 当时我的应用程序正在使用的内存只有80MB。 我不为什么这些方法返回NULL。 有我丢失的东西。
此外,内存不断即使我释放字节数组和字符串为Java创建增加。
这里是源代码。
void create_jvm(void)
{
JavaVMInitArgs vm_args;
JavaVMOption vm_options;
vm_options.optionString = "-Djava.class.path=c:\\Store";
vm_args.version = JNI_VERSION_1_4;
vm_args.nOptions = 1;
vm_args.options = &vm_options;
vm_args.ignoreUnrecognized = 0;
JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
if(env != null)
{
j_store = (*env)->FindClass(env, "com/store");
if(j_store == null)
{
printf("unable to find class. class name: JStore");
}
}
}
void add(char* key, char* value, int length)
{
jstring j_key = (*env)->NewStringUTF(env, key);
jbyteArray j_value = (*env)->NewByteArray(env, length);
(*env)->SetByteArrayRegion(env, j_value, 0, length, (jbyte *)value);
ret = (*env)->CallStaticBooleanMethod(env, j_store, method_id, j_key, j_value);
if(j_value != null)
{
(*env)->ReleaseByteArrayElements(env, j_value, (jbyte *)value, 0);
}
if(j_key != null)
{
(*env)->ReleaseStringUTFChars(env, j_key, key);
}
}
Java端临危在哈希表中的字节[]中的数据并将其存储。 问题是,每次代码运行内存仅增加了,并且永远不会释放。 我试图添加1个MB对象并调试它。
该过程内存1MB增加当我打电话NewByteArray。 但是,当CallStaticBooleanMethod被称为由4MB进程的内存增加。 并调用ReleaseByteArrayElements不会释放内存的。
如果我在这之后再添1MB的对象,然后当我打电话NewByteArray,它由1MB提升当我打电话CallStaticBooleanMethod但仍然是相同的,当我尝试释放字节数组进程的内存保持不变。