1. 程式人生 > >JNI區域性變數和全域性變數引用

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


相關推薦

JNI區域性變數全域性變數引用

1.區域性變數引用 定義在本地方法內的區域性變數,會隨著方法呼叫完return後,區域性變數也會隨著被釋放。 所以,不要在本地方法中定義static變數來儲存資料!舉個栗子: 像上面這樣子是

Python-13-函式_02_區域性變數全域性變數

1 """ 2 # 1、區域性變數和全域性變數 3 4 在子程式中定義的變數稱為區域性變數,在程式的一開始(程式碼前面沒有縮排)定義的變數稱為全域性變數。 5 全域性變數作用域是整個程式,區域性變數作用域是定義該變數的子程式。 6 當全域性變數與區域性變數同名時: 7 在定義區域性變數的

T-SQL 區域性變數全域性變數

區域性變數 1 use StudentManageDB 2 go 3 --宣告學號變數 4 declare @stuid int,@stuname varchar(20) 5 6 --查詢李銘的資訊 7 set @stuname='李銘' 8 select StudentId,Stu

SQL中的區域性變數全域性變數

在SQL中,我們常常使用臨時表來儲存臨時結果,對於結果是一個集合的情況,這種方法非常實用,但當結果僅僅是一個數據或者是幾個資料時,還要去建一個表,顯得就比較麻煩,另外,當一個SQL語句中的某些元素經常變化時,比如選擇條件,(至少我想)應該使用區域性變數。當然MS

區域性變數全域性變數,以及作用範圍

       在寫工程檔案的時候,犯了一個基礎性的錯誤,基礎不牢,地動山搖。所以通過查閱資料回顧了一些相關知識,並記錄下來。防止以後再發生這種慘案。 變數按儲存區域分:全域性變數、靜態全域性變數和靜態區域性變數都存放在記憶體的靜態儲存區域,區域性變數存放在記憶體的棧區。

關於區域性變數全域性變數的儲存空間大小問題

下午做最長公共子序列的時候遇到的問題,問了felix後恍然大悟...看程式碼 #include <stdio.h> int main(){ int a[1000000];//區域性變數 return 0; } 編譯執行後發現溢位錯誤。 #include &l

有關 陣列作為函式引數 & 區域性變數全域性變數及其應用

一、陣列blabla 1.0陣列元素作函式實參。 (1).陣列元素可以用作函式實參,但不能是形參。(給陣列分配的儲存單元是連續的) 2.0一維陣列名作函式引數。 (1)陣列元素作實參時,向形參變數傳遞的時陣列元素的值。 陣列名作實參時,向形參傳遞的時陣列首元素的地址。

python 函式的區域性變數全域性變數 global

本文轉載自http://blog.csdn.net/mldxs/article/details/8559973 侵刪 當你在函式定義內宣告變數的時候,它們與函式外具有相同名稱的其他變數沒有任何關係,即變數名稱對於函式來說是 區域性 的。這稱為變數的 作用域 。所有變數的

C語言中區域性變數全域性變數變數的儲存類別(static,extern,auto,register)

C語言中區域性變數和全域性變數變數的儲存類別(static,extern,auto,register) 1----區域性變數和全域性變數 在討論函式的形參變數時曾經提到,形參變數只在被呼叫期間才分配記憶體單元,呼叫結束立即釋放。這一點表明形參變數只有在函式內才是有效的,離開該函式就不能再使用了。

python基礎之四種函式型別、函式的巢狀呼叫、函式的區域性變數全域性變數

函式根據有沒有引數,有沒有返回值,可以相互組合,一共有4種 * 無引數,無返回值 * 無引數,有返回值 * 有引數,無返回值 * 有引數,有返回值 <1>無引數,無返回值的函式此類函式,不能接收引數,也沒有返回值,一般情況下,列印提示燈類似的功能,使用這類的函式 def pr

jmeter多執行緒併發時,區域性變數全域性變數的區別

1. 業務場景5個使用者登入系統,需要將登入介面A返回的token作為介面B的入參。介面B設定集合點,同時請求後臺介面。2. 指令碼2.1  目錄結構                2.2  多個使用者資訊獲取                採用csv檔案儲存使用者資訊   

java 區域性變數全域性變數問題

所謂臨時變數,就是為了方便起見申明的變數,存放一些中間結果。有點像中學幾何裡 面的輔助線。 如果基於效能的考慮,避免每次呼叫的時候為臨時變數分配空間,就可以將它宣告為成 員變數,例如臨時壓縮緩衝區。 如果基於效能的考慮,避免每次訪問的時候訪問成員變數(尤其在迴圈的時候),

python 區域性變數全域性變數 global

當你在函式定義內宣告變數的時候,它們與函式外具有相同名稱的其他變數沒有任何關係,即變數名稱對於函式來說是 區域性 的。這稱為變數的 作用域 。所有變數的作用域是它們被定義的塊,從它們的名稱被定義的那點開始。 #!/usr/bin/python # Filename:

python 類中變數 區域性變數全域性變數

1.類中初始化變數 class dig():     def __init__(self,x,y):         self.x=x         self.y=y     def pd(self

python 區域性變數全域性變數 global

當你在函式定義內宣告變數的時候,它們與函式外具有相同名稱的其他變數沒有任何關係,即變數名稱對於函式來說是 區域性 的。這稱為變數的 作用域 。所有變數的作用域是它們被定義的塊,從它們的名稱被定義的那點開始。 #!/usr/bin/python # Filename:

區域性變數全域性變數在記憶體中的儲存位置

靜態儲存方式:是指在程式執行期間分配固定的儲存空間的方式。 動態儲存方式:是在程式執行期間根據需要進行動態的分配儲存空間的方式。 使用者儲存空間可以分為三個部分: 1)程式區; 2)靜態儲存區; 3)動態儲存區; 全域性變數全部存放在靜態儲存區,在程式開始執行時給全域性

區域性變數全域性變數的初始化

寫程式碼的時候遇到了這個問題,選兩段抄過來做個筆記。定義區域性變數,其實就是在棧中通過移動棧指標來給程式提供一個記憶體空間和這個區域性變數名繫結。因為這段記憶體空間在棧上,而棧記憶體是反覆使用的(髒的,上次用完沒清零的),所以說使用棧來實現的區域性變數定義時如果不顯式初始化,

區域性變數全域性變數的差別

全域性變數、靜態全域性變數、靜態區域性變數和區域性變數 全域性變數、靜態變數如果沒有手動初始化,則有編譯器初始化為0。 區域性變數是編譯器永遠不會初始化的變數,如果沒有手動初始化,區域性變數的值為隨機值。 在函式內使用全域性變數,一般應做全域性變數說明,只有在函式內

關於ArrayList儲存區域性變數全域性變數的易錯筆記

       物件的宣告放在棧記憶體,在例項化物件的時候,會在堆記憶體開闢一個記憶體,然後把這個記憶體的地址交給物件。這個就是物件的宣告和例項化過程。  (一)關於使用ArrayList儲存全域性

C語言中區域性變數全域性變數解釋

區域性變數 :   在一個函式內部定義的變數是區域性變數,它只在本函式範圍內有效,也就是說只有在本函式內才能使 用它,在此函式外是不能使用這些變數的。這些稱為區域性變數。   說明     (1)  不同函式中可以使用相同名字的變數,它們代表不同的變數,互不干擾。