JNI局部变量和全局变量引用

转载请注明本文出自文韬_武略的博客(http://blog.csdn.net/fwt336/article/details/60867414),请尊重他人的辛勤劳动成果,谢谢!


1.局部变量引用

定义在本地方法内的局部变量,会随着方法调用完return后,局部变量也会随着被释放。

所以,不要在本地方法中定义static变量来存储数据!举个栗子:


像上面这样子是不行滴!

当我们不再使用引用类型时,应该收到释放掉,及时回收内存,虽然return后会释放内存,但是垃圾回收不够及时。

在本机方法返回后,使用虚拟机删除16个本地引用是可以接受的!

2.全局变量引用

2.1强引用

对于全局变量的引用需要调用NewGlobalRef方法。


2.2弱引用

而对于弱引用也是类似,需要调用(*env)->NewWeakGlobalRef()方法。

2.3引用对象的比较

引用对象的比较,需要调用(*env)->IsSameObject(env, obj1, obj2)方法进行比较即可。


3.引用的释放

3.1局部变量引用的释放

当引用对象不使用的时候,我们需要尽快的释放内存,以提高内存使用率。调用(*env)->DeleteLocalRef(env, object);方法。尤其是对于大内存数据的引用。

例如:

当需要处理大内存文件,或者循环创建变量时,需要确保有足够的内存空间来创建变量,调用EnsureLocalCapacity方法。


或者是,我们可以调用Push/PopLocalFrame方法,来限制局部变量的内存大小,例如:   

通过PushLocalFrame方法创建一个新的变量的最大范围,通过PopLocalFrame方法来释放所有局部变量内存。


3.2释放全局变量

  强引用全局变量的释放:DeleteGlobalRef,而弱引用的释放:DeleteWeakGlobalRef。当全局变量不再需要使用了,就需要调用相对应的释放方法来立即释放内存。


注意:

1.当你在写本地方法的时候,需要小心不要遗漏了任何局部变量的释放,因为这个方法可能被多次调用,而导致内存溢出。

2.当我们需要缓存全局变量时,保证可以多次调用,也可以多线程调用时,可以这么写



  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值