Java NewStringUTF()和释放内存
在将分配的字符串传递到Java NewStringUTF()和释放内存,java,java-native-interface,Java,Java Native Interface,在将分配的字符串传递到NewStringUTF()后是否应释放该字符串 我有一些类似的代码: char*测试; jstring j_试验; 测试=某些函数();//NewStringUTF(环境、测试); 免费(测试);// NewStringUTF()的const char*参数的存储完全由您负责:如果您使用malloc()分配了test,那么您需要free()它。因此,您发布的代码片段是正确的。你正在其他地方腐蚀垃圾堆 我看到相互矛盾的意见。有人说我 有人说虚拟机应该自己释放它 释放它,有人
NewStringUTF()后是否应释放该字符串
我有一些类似的代码:
char*测试;
jstring j_试验;
测试=某些函数();//NewStringUTF(环境、测试);
免费(测试);// NewStringUTF()
的const char*
参数的存储完全由您负责:如果您使用malloc()
分配了test
,那么您需要free()
它。因此,您发布的代码片段是正确的。你正在其他地方腐蚀垃圾堆
我看到相互矛盾的意见。有人说我
有人说虚拟机应该自己释放它
释放它,有人说虚拟机没有释放
它和你应该做奇怪的巫毒
释放它的魔法。我很困惑
他们正在讨论由NewStringUTF()
返回的jstring
实例。这遵循了令人困惑的规则
完成此引用后,使用DeleteLocalRef()
释放此引用决不是错误。但是,如果在JVM线程的上下文中调用NewStringUTF()
,JVM会执行一些可疑的魔法。当本机方法返回Java时,任何泄漏的本地引用都会自动清除。因此,如果确定最终调用方位于Java线程中,那么可以安全地泄漏引用
另一方面,如果您是在本机线程的上下文中运行的(例如,某个事件报告线程回调Java),则永远不会返回Java,因此您必须自己在这个jstring
上调用DeleteLocalRef()。我现在知道我的问题在哪里了。我需要一个更持久的jstring。一个成为垃圾收集器的一部分,并且只有在我真正处理完之后才被清理的垃圾收集器。是否有过这样的情况:在使用NewStringUTF()
获得的jstring
上调用DeleteLocalRef()
是不安全的/不正确的?@namuol如果以后要将jstring传递给java,您现在不应该删除它。旁注:jni保存本地引用的条目是有限的,所以最好在您不需要本地引用时立即删除它。想象一下,下面的代码将导致(inti=0;i<100000;i++){callToJava(NewStringUTF(…)})
崩溃,jni会抱怨本地引用太多。Push/PopLocalFrame是您的朋友,尤其是在使用非JVM线程时。它处理足够的本地引用空间的分配,以及自动清理仍然悬空的任何本地引用。