JNI區域性變數和全域性變數引用
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.當我們需要快取全域性變數時,保證可以多次呼叫,也可以多執行緒呼叫時,可以這麼寫