我一直在阅读关于finalize()的很多新手Java问题,并发现有点令人困惑的是,没有人真正说明finalize()是一种不可靠的清理资源的方法.我看到有人评论说他们用它来清理Connections,这真的很可怕,因为接近Connection的关闭的唯一方法就是最终实现try(catch).
我没有受过CS的教育,但是我已经用Java专业编程近十年了,我从未见过有人在生产系统中实现finalize().这仍然不意味着它没有它的用途,或者我与之合作过的人一直在做正确的事.
所以我的问题是,实现finalize()的用例是什么,无法通过语言中的其他进程或语法更可靠地处理?
请提供具体的方案或您的经验,只是重复Java教科书,或最终确定的用途是不够的,这不是这个问题的意图.
当我使用JNI方法构建java对象时,为了将其作为参数传递给我正在使用JNI调用API调用的java方法,我该如何管理它的内存?
这是我正在使用的:
我有一个C对象,它有一个更复杂的析构函数方法free().这个C对象与Java对象相关联,一旦应用程序完成Java对象,我就不再需要C对象了.
我正在创建这样的Java对象(为了清楚起见,错误检查已被省略):
c_object = c_object_create ();
class = (*env)->FindClass (env, "my.class.name");
constructor = (*env)->GetMethodID (env, class, "<init>", "(J)V");
instance = (*env)->NewObject (env, class, constructor, (jlong) c_object);
method = (*env)->GetMethodID (env, other_class, "doSomeWork", "(Lmy.class.name)V");
(*env)->CallVoidMethod (env, other_class, method, instance);
Run Code Online (Sandbox Code Playgroud)
那么,既然我已经完成了instance,我该怎么办呢?理想情况下,我想将垃圾收集器留给VM; 当它完成时instance它会很棒,如果它也调用c_object_destroy()我提供给它的指针.这可能吗?
一个单独但相关的问题与我在这样的方法中创建的Java实体的范围有关; 我必须手动释放,也就是说,class,constructor,或method以上?关于适当的内存管理问题,JNI文档令我感到沮丧(在我看来).