我一直在阅读关于finalize()的很多新手Java问题,并发现有点令人困惑的是,没有人真正说明finalize()是一种不可靠的清理资源的方法.我看到有人评论说他们用它来清理Connections,这真的很可怕,因为接近Connection的关闭的唯一方法就是最终实现try(catch).
我没有受过CS的教育,但是我已经用Java专业编程近十年了,我从未见过有人在生产系统中实现finalize().这仍然不意味着它没有它的用途,或者我与之合作过的人一直在做正确的事.
所以我的问题是,实现finalize()的用例是什么,无法通过语言中的其他进程或语法更可靠地处理?
请提供具体的方案或您的经验,只是重复Java教科书,或最终确定的用途是不够的,这不是这个问题的意图.
我有以下JNI方法本地创建Java对象的集合,然后将它们返回到Java:
JNIEXPORT jobject JNICALL Java_com_test_myClass_myMethod(JNIEnv * env, jclass klass) {
jclass arrayClass = env->FindClass("java/util/ArrayList");
jmethodID initMethod = env->GetMethodID(arrayClass, "<init>", "()V");
jmethodID addMethod = env->GetMethodID(arrayClass, "add", "(Ljava/lang/Object;)Z");
jobject myArray = env->NewObject(arrayClass, initMethod);
env->CallBooleanMethod(myArray, addMethod, env->NewStringUTF("Hello"));
env->CallBooleanMethod(myArray, addMethod, env->NewStringUTF("World"));
return myArray;
}
Run Code Online (Sandbox Code Playgroud)
我是否需要释放在本机代码中创建的对象,还是由GC自动完成?如果我这样做,我该怎么做,因为我需要将它返回到Java?
c++ java java-native-interface memory-leaks memory-management
我想在C中分配一些内存并使其与java对象实例相关联,如下所示:
void configure(JNIEnv *object, jobject obj, ....) {
char *buf = new char[1024];
// associated <buf> with <obj> somehow
}
Run Code Online (Sandbox Code Playgroud)
然后在java对象被垃圾收集时释放内存 - 我可以通过从java对象的finalize()方法调用JNI函数来实现.
问题是,如何将C指针与java对象相关联?在对象中保留一个长字段并将指针强制转换为长?有没有更好的办法?
这里有人成功在Valgrind下运行 Eclipse吗?我正在与涉及 JNI 代码的特别棘手的崩溃作斗争,并希望 Valgrind 或许可以(再次)证明其卓越性,但是当我在 Valgrind 下运行 Eclipse 时,JVM 终止并显示一条有关无法创建初始对象的错误消息堆(我目前无法访问确切的错误消息;我会尽快编辑这篇文章。)