JNI本地引用自动释放时机咨询:多层嵌套调用场景疑问
JNI局部引用自动释放时机的问题解答
针对你描述的JNI调用链场景:Java调用Native函数function1 → function1调用Java函数function2 → function2调用Native函数function3,关于function3中创建的LocalReference自动释放时机,结论是在function3返回时自动释放,原因如下:
- JNI局部引用的生命周期绑定到当前Native方法对应的JNI局部引用帧。每一次Java调用Native方法时,JVM都会为该Native方法创建一个独立的JNI局部引用帧,用于管理这次调用中产生的所有局部引用。
- 当
function3作为被Java(function2)调用的Native方法,它的JNI局部引用帧会在function3执行完毕、返回给Java层的function2时被JVM销毁,帧内的所有局部引用会被自动释放。 function1的JNI帧是独立于function3的,只有当function1完全执行完毕返回给最初的Java调用方时,它自己帧内的局部引用才会被释放,但这和function3的局部引用无关。
额外补充:如果需要避免局部引用占用过多内存,可以在function3中通过调用DeleteLocalRef()手动提前释放局部引用,不过自动释放的规则仍遵循上述帧销毁逻辑。
内容的提问来源于stack exchange,提问作者healthsgood
相关产品推荐
相关产品推荐

