课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
引用是我们在学习软件编程开发技术的时候需要重点掌握的一个编程概念,而本文我们就通过案例分析来简单了解一下,常见的三种引用策略都有哪些类型。
1、局部引用
局部引用又称为本地引用,局部引用会在函数结束时自动释放,例如函数FindClass返回的就是一个局部引用。需要注意的是局部引用的个数是有限的,一般是512个,所以局部引用能手动释放的尽早手动进行释放,特别是在一些循环体内,使用完毕马上进行释放,否则很可能会超出局部引用个数的限制。
同时局部引用还会阻止对象被回收,也就是影响GC,所以更应该在不需要时尽早进行释放,通过函数DeleteLocalRef可以释放局部引用。
不能在本地方法中通过静态变量来储存本地引用,并在后续调用中使用相同的引用,因为本地引用是会被自动释放的。
局部引用仅仅在创建它的线程中是有效的。在线程A中被创建的局部引用是不能够在线程B中被使用的。千万不要将一个局部引用保存在全局变量中给其他线程使用。
如果你使用AttachCurrentThread连接(attach)了Native进程,正在运行的代码在线程分离(detach)之前绝不会自动释放局部引用。使用者创建的任何局部引用必须手动删除。
2、全局引用
全局引用不会在函数结束时自动释放,如果没有释放则会在程序运行期间一直保留,所以特别适合用来做一些缓存的操作。
不同于局部引用,全局引用是可以跨线程使用的,只要它不被程序员手动释放就会一直有效。
通过函数NewGlobalRef可以创建一个全局引用,当你的本地代码不再需要访问一个全局引用时,你应该调用DeleteGlobalRef方法。如果你忘记调用这个函数,虚拟机将无法通过垃圾收集器回收相应的对象,即使这个对象再也不会在系统的其他地方中使用。
注意jfieldID和jmethodID是映射类型(opaquetypes),不是对象引用,不应该被传入到NewGlobalRef。原始数据指针,像GetStringUTFChars和GetByteArrayElements的返回值,也都不是对象(它们能够在线程间传递,并且在调用对应的Release函数之前都是有效的)。
3、弱全局引用
弱全局引用不像局部引用哪样在函数结束时自动释放,也不像全局引用哪有一直保留在内存中,弱全局引用在GC的时候是可能会被垃圾回收的,因此每次在使用弱全局引用之前都需要进行判空处理。可以通过函数IsSameObject与NULL对比判断当前弱全局引用是否还有效。绝不要在Native代码中用==符号来比较两个引用。
通过函数NewWeakGlobalRef可以创建一个弱全局引用,当你的本地代码不再需要访问一个弱全局引用时,你应该调用DeleteWeakGlobalRef函数释放掉弱全局引用。如果你忘记调用这个函数,Java虚拟机仍然能够通过垃圾收集器收集底层对象,但是将无法回收该弱全局引用对象占用的内存。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。