java如何做全局緩存_傳智播客JNI第七講 – JNI中的全局引用/局部引用/弱全局引用、緩存jfieldID和jmethodID的兩種方式...

講解JNI中的全局引用/局部引用/弱全局引用、緩存jfieldID和jmethodID的兩種方式,并編寫兩種緩存方式的示例代碼。

1.從Java虛擬機創建的對象傳到本地C/C++代碼時會產生引用,根據Java的垃圾回收機制,只要有引用存在就不會出發該引用指向的Java對象的垃圾回收。

2.這些引用在JNI中分為三種:

全局引用:Global Reference

局部引用:Local Reference

若全局引用:Weak Global Reference since JDK1.2

3.局部引用

1)最常見的引用類型,基本上通過JNI返回來的引用都是局部引用。例如使用NewObject就會返回創建出來的實例的局部引用,局部引用只在該native函數中有效,所有在該函數中產生的局部引用,都會在函數返回的時候自動釋放,也可以使用DeleteLocalRef函數手動釋放該引用。

2)想一想既然局部引用能夠在函數返回時自動釋放,為什么還需要DeleteLocalRef函數呢?

3)實際上,局部引用存在,就會防止其指向的對象被垃圾回收,尤其是當一個局部引用指向一個很龐大的對象,或是在一個循環中生成了局部引用,最好的做法就是在使用完該對象后,或在循環尾部把這個引用釋放掉,以確保在垃圾回收器被處罰的時候被回收。

4)在局部引用的有效期中,可以傳遞到別的本地函數中,要強調的是他的有效期仍然只在一次的Java本地函數調用中,所以千萬不能用C++全局變量保存它或者把它定義為C++靜態局部變量。

4.全局引用

1)全局引用可以跨越當前線程,在多個native函數中有效,不過需要編程人員手動來釋放該引用,全局引用存在期間會防止在Java的垃圾回收。

2)與局部引用不同,全局引用的創建不是由JNI自動創建的,全局引用時需要調用NewGlobalRef函數,而釋放它需要使用ReleaseGlobalRef函數。

5.弱全局引用

1)Java1.2新出來的功能,與全局引用相似,創建跟刪除都需要由編程人員來進行。這種引用與全局引用一樣可以再多個本地代碼有效,也跨越多線程有效,不一樣的是,這種引用將不會阻止垃圾回收器回收這個引用所指向的對象。

2)使用NewWeakGlobalRef跟ReleaseWeakGlobalRef來產生和解除引用。

6.關于引用的一些函數

jobject NewGlobalRef(jobject obj);

jobject NewLocalRef(jobject obj);

jobject NewWeakGlobalRef(jobject obj);

void DeleteGlobalRef(jobject obj);

void DeleteLocalRef(jobject obj);

void DeleteWeakGlobalRef(jobject obj);

jboolean IsSameObject(jobject obj1, jobject obj2); // 這個函數對于弱全局引用還有一個特別的功能,把NULL傳入要比較的對象中,就能夠判斷弱全局引用所指向的Java對象是否被回收。

7.緩存jfieldID,jmethodID

1)取得jieldID跟jmethodID的時候會通過該屬性、方法名稱加上簽名來查詢相應的jfieldID,jmethodID。這種查詢相對來說開銷較大,我們可以將這些FieldID,MethodID緩存起來,這樣只需要查詢一次,以后就使用緩存起來的FieldID,MethodID。

2)介紹兩種緩存方式

1.在用的時候緩存

2.在Java類初始化時緩存

11)在第一次使用的時候緩存

在native code中使用static局部變量來保存已經查詢過的id,這樣就不會再每次的函數調用時查詢,而只要第一次查詢成功后就保存起來了。

不過在這種情況下就不得不考慮多線程同時呼叫此函數時可能會招致同時查詢的危機,不過這種情況是無害的,因為查詢同一個屬性,方法的ID通常返回的是一樣的值。

JNIEXPORT void JNICALL Java_Test_native(JNIEnv* env, jobject obj){

static jfieldID fieldID_string = NULL;

jclass clazz = env->GEtObjectClass(obj);

if(fieldID_string == NULL){

fieldID_string = env->GetFieldID(clazz, "string", "Ljava/lang/String;");

}

// other code...

}

22)在Java類初始化的時候緩存

更好的一個方式就是在任何native函數調用前把id全部存起來。

我們可以讓Java在第一次加載這個類的時候首先調用本地代碼初始化所有的jfieldID,jmethodID,這樣的話,就可以省去多次的確定id是否存在的語句,當然,這些jfieldID,jmethodID是定義在C/C++的全局。

使用這種方式的好處,當Java類卸載或是重新加載的時候,也會重新呼叫該本地代碼來重新計算IDs。

70e3e903f667c9fcd45b828c132178f2.png

課程最后總結

在這一課中,我們學習了:

1.最簡單的Java調用C/C++函數的方法

2.取得方法、屬性的ID,學會了取得/設置屬性,還有Java函數的調用。

3.Java/c++之間的字符串的轉換問題。

4.在C/C++下如何操作Java數組。

5.三種引用方式

6.如何緩存屬性和方法的ID

使用JNI的兩個弊端

1.使用了JNI,那么這個應用就不能跨平臺了,如果需要移植到別的平臺上,那么native代碼就需要重新編寫。

2.Java是強類型的語言,而C/C++不是,你必須寫JNI時更小心。

3.盡量少使用本地代碼。

其它

1.異常處理

2.C/C++如何啟動JVM

3.JNI跟多線程

介紹兩本書作為參考:

1)The Java Native Interface Programmer's Guide and Specification

2))JNI++ User Guide

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/258108.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/258108.shtml
英文地址,請注明出處:http://en.pswp.cn/news/258108.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

起一卦,還是那個破事。還是大兇。

公元:2013年6月20日11時48分46秒 陽3局農歷:2013年05月12日11時48分芒種:2013-6-5 20:44:00 小暑:2013-7-7 7:09:00干支:癸巳年 戊午月 丁巳日 丙午時 旬空:午未空 子丑空 子丑空 寅卯空直符&#…

老工業基地調整改造與振興

老工業基地調整改造與振興 一、運用“兩只手”,加快工業結構調整 一方面,運用市場機制即“看不見的手”進行調整。通過市場競爭機制、價格波動機糾、供求均衡機制、優勝劣汰機制等,實現資源的合理流動和優化配置。 另一方面,運用宏…

如何使用DNS反向映射來掃描IPv6地址?

目前增加的IPv6地址空間不僅提高了對啟發式算法的使用(執行IPv6地址掃描時),而且還推動了人們探索替代技術用于查找IPv6節點。本文中我們將探討如何使用一種極其強大的向量來發現IPv6節點:使用DNS反向映射。 IPv6地址掃描攻擊通常…

java jre下載安裝教程_java JRE下載、安裝以及環境變量教程

java JRE下載、安裝以及環境變量教程作者:小丸子 來源:PC下載網時間:2017-10-17 19:12:33JRE也就是(Java Runtime Environment)Java運行環境,是運行JAVA程序所必須的環境的集合,包含各種類庫。今天PC下載網小編為您介紹jre的下載 安裝 跟環境變量的配置1…

java環境變量設置與java查看安裝路徑

把jdk安裝到計算機中之后,我們來進行設置使java環境能夠使用。 首先右鍵點我的電腦。打開屬性。然后選擇“高級”里面的“環境變量”,在新的打開界面中的系統變量需要設置三個屬性“JAVA_HOME”、 “path”、“classpath”,其中在沒安裝過jdk的環境下。p…

C#設計模式學習筆記-單例模式

C#設計模式學習筆記-單例模式 最近在學設計模式,學到創建型模式的時候,碰到單例模式(或叫單件模式),現在整理一下筆記。 在《Design Patterns:Elements of Resuable Object-Oriented Software》中的定義是&…

kotlin為什么比java編譯慢_為什么Kotlin編譯速度比Scala快? [關閉]

雖然我認為這個問題不適合Stack Overflow,因為它傾向于主要產生基于意見的答案,但這里有一個嘗試:你有兩種不同的語言,特別是關于類型系統,以及兩個完全獨立的編譯器實現 . 所以期望它們具有“相同”的編譯速度已經是一…

錫山國土推行數據中心“在線變更”

為全面提高全區土地變更工作效率,國土錫山分局全面推行數據中心在線變更。由不動產登記科利用數據中心管理平臺,將遙感影像、監測信息以及監測圖斑的土地利用現狀信息、土地利用總體規劃信息錄入“數據中心”,制定我區的變更調查工作方案&…

Linux 安裝loadrunner 碰到的問題

關于linux下面搭建loadrunner的詳細步驟: http://blog.sina.com.cn/s/blog_9aa583cf0101bu4y.html http://hi.baidu.com/higkoo/item/d75027acc78bab3e030a4dde?qq-pf-topcqq.c2c http://www.cnblogs.com/xiaoTT/archive/2012/02/15/2352127.html 用控制臺加載負載…

數據分析真的能驅動用戶快速增長嗎?

俗話說,“酒香不怕巷子深”;俗話又說,“酒香也怕巷子深” 。再后來,俗話還說,管他酒香不香巷子深不深,只要找個算盤技巧神乎其神的賬房先生,即數據科學家,酒就可以大賣了。這叫做用數據驅動用戶…

java 常見bug_java常見bug

org.hibernate.QueryException: could not resolve property: menuId of:無法解析menuId 字段,是指這個字段有錯Servlet.service() for servlet default threw exception09:28:54,704 ERROR [CoyoteAdapter] An exception or error occurred in the container durin…

解決啟動Biee控制臺亂碼問題

解決啟動Biee控制臺亂碼問題 在安裝完Biee后,大家都可以看到在程序中可以找到啟動BI服務的地方 點擊上圖中的啟動bi服務則在window系統中會彈出一個dos窗口,來顯示執行啟動服務的操作,如下圖 上圖顯示的是正常情況,本人安裝后首次…

“北航Clubs” Alpha版發布!

一、功能 1.獲取活動信息: 用戶進入網站后,第一眼就可以查看到近期活動 2.查看活動詳情 點擊活動標題,可以進入活動詳情頁面 3.注冊功能 首頁點擊注冊,輸入學號、密碼、姓名、手機號即可完成注冊 4.用戶登陸 擁有賬號之后&#xf…

物聯網與零邊際成本共享經濟

物聯網是由通訊網絡、能源網絡、物流網絡組成,這些網絡共同在單一操作系統中合作,持續尋找各種方法來提升資源整編、生產及配送商品和服務,以及廢棄物回收等過程中的熱力效率和生產力;這三種網絡相輔相成,缺一不可。若缺乏通訊&am…

C++程序設計教程學習(1)-第一部分 編程基礎

第一章 概述 C到底難不難學?沒有學不會的事情 1.1 程序設計語言 語言 編程語言 人和計算機交流的工具,群體擴大,人人間交流過程描述與信息表達的工具 機器語言,匯編語言,高級語言 1.2 C簡史 1.3 C 褒貶C 計算機應用范圍…

《Programming WPF》翻譯 第9章 6.我們進行到哪里了?

《Programming WPF》翻譯 第9章 6.我們進行到哪里了? 原文:《Programming WPF》翻譯 第9章 6.我們進行到哪里了?只有當任何內嵌控件都沒有提供你需要的底層行為時,你將要寫一個自定義控件。當你寫一個自定義控件,你將要使用到依賴…

php實現上傳,PHP實現文件上傳例子

實例1:上載文件表單網頁:updatefile.htm上載文件表單請選取文件:[CtrlA 全部選擇 然后拷貝]處理上載文件網頁:updatefile.php3處理上載文件copy($userfile, "newfilename");echo $userfile." - 用戶上傳到服務器上的文件臨時存…

浙企加入中國大數據產業生態聯盟 共商數據價值

基于大數據時代的考量,在工業和信息化部指導下,8月2日,中國電子信息產業發展研究院聯合大數據產業鏈各環節企業及第三方產業機構自愿組成非營利社會組織——中國大數據產業生態聯盟。浙江企業元寶鋪受邀成為聯盟理事成員單位。 大會現場&…

hdu 4442 Physical Examination (2012年金華賽區現場賽A題)

昨天模擬賽的時候坑了好久,剛開始感覺是dp,仔細一看數據范圍太大。 題目大意:一個人要參加考試,一共有n個科目,每個科目都有一個相應的隊列,完成這門科目的總時間為ab*(前面已完成科目所花的總時…

xsd學習教程

http://www.w3school.com.cn/schema/轉載于:https://www.cnblogs.com/eric-lin/p/4969269.html