怎么理解SAPABAP和Java里的弱引用和軟引用-創(chuàng)新互聯(lián)

這篇文章主要講解了“怎么理解SAP ABAP和Java里的弱引用和軟引用”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“怎么理解SAP ABAP和Java里的弱引用和軟引用”吧!

創(chuàng)新互聯(lián)建站專注于虎林企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站,購物商城網(wǎng)站建設(shè)?;⒘志W(wǎng)站建設(shè)公司,為虎林等地區(qū)提供建站服務(wù)。全流程按需網(wǎng)站策劃,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)建站專業(yè)和態(tài)度為您提供的服務(wù)

不知道大家留意過這個(gè)ABAP抽象類CL_ABAP_REFERENCE嗎?這個(gè)抽象類只有一個(gè)GET方法,返回一個(gè)對(duì)象引用。

怎么理解SAP ABAP和Java里的弱引用和軟引用

它的兩個(gè)子類CL_ABAP_SOFT_REFERENCE和CL_ABAP_WEAK_REFERENCE,分別實(shí)現(xiàn)了抽象類的GET方法,不過均在ABAP Kernel里實(shí)現(xiàn)的,對(duì)ABAP應(yīng)用開發(fā)人員來說,看不見源代碼,是一個(gè)黑盒子。

怎么理解SAP ABAP和Java里的弱引用和軟引用

怎么使用這個(gè)類呢?還是查看SAP幫助文檔:

怎么理解SAP ABAP和Java里的弱引用和軟引用

An object in the system class CL_ABAP_WEAK_REFERENCE represents a weak reference to an object in a class. Unlike regular object references, a weak reference is ignored during execution of the garbage collector. This means that a weak reference does not prevent the referenced object from being deleted when the garbage collector is executed.

CL_ABAP_WEAK_REFERENCE類的實(shí)例, 代表指向一個(gè)對(duì)象實(shí)例的弱應(yīng)用。從字面上理解,既然存在弱引用,自然也存在其對(duì)立面的強(qiáng)應(yīng)用。假設(shè)有一個(gè)ABAP類lcl_person:

DATA: lo_person TYPE REF TO lcl_person.
CREATE OBJECT lo_person.

上述代碼定義了一個(gè)指向lcl_person對(duì)象實(shí)例的強(qiáng)引用變量,名為lo_person. 當(dāng)垃圾回收器工作的時(shí)候,只要lcl_person對(duì)象實(shí)例的強(qiáng)引用lo_person還有效(即沒有調(diào)用CLEAR, 或者沒有被重新賦值指向其他的對(duì)象實(shí)例), 則lo_person對(duì)象實(shí)例所占據(jù)的內(nèi)存區(qū)域不會(huì)被ABAP垃圾回收器釋放。換句話說,lcl_person對(duì)象實(shí)例如果至少存在一個(gè)指向它的強(qiáng)引用,則在任何情況下,其內(nèi)存區(qū)域都不會(huì)被ABAP垃圾回收器回收。

而弱引用,在垃圾回收階段會(huì)直接被忽略。這就意味著,在ABAP垃圾回收器開始工作的時(shí)候,如果一個(gè)對(duì)象實(shí)例并未有任何強(qiáng)引用指向它,此時(shí)無論有無弱引用指向它,該對(duì)象實(shí)例都無法逃脫被回收的命運(yùn)。

看個(gè)具體的例子。

這個(gè)30行的ABAP報(bào)表,實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的LCL_PERSON類。第17行創(chuàng)建了一個(gè)該類的實(shí)例,該實(shí)例的強(qiáng)引用存儲(chǔ)在引用變量lo_person里。

第18行創(chuàng)建了一個(gè)包裹LCL_PERSON對(duì)象實(shí)例的弱引用lo_weak. 調(diào)用弱引用lo_weak的get方法,在兩種不同的情況下有兩種不同的返回結(jié)果:

(1) 如果第17行創(chuàng)建的lcl_person對(duì)象實(shí)例已經(jīng)被垃圾回收器回收了,則get返回一個(gè)空引用; (2) 如果lcl_person對(duì)象實(shí)例沒有被回收,則返回指向其的引用。

怎么理解SAP ABAP和Java里的弱引用和軟引用

需要本文源代碼的朋友,可以在我的SAP社區(qū)博客里找到:

Weak reference in ABAP and Java

我給這個(gè)ABAP程序指定了兩個(gè)輸入?yún)?shù),clear和gc,分別控制是否清除強(qiáng)引用變量lo_person,和是否用代碼調(diào)用ABAP垃圾回收器。

如果執(zhí)行程序時(shí)傳入的參數(shù)clear置為true,則調(diào)用CLEAR: lo_person. 根據(jù)ABAP幫助文檔,CLEAR施加在引用變量lo_person上,執(zhí)行后lo_person指向空引用(null reference).

怎么理解SAP ABAP和Java里的弱引用和軟引用

另一個(gè)參數(shù)gc置為true,則用代碼的方式啟動(dòng)ABAP垃圾回收器:cl_abap_memory_utilities=>do_garbage_collection.

這兩個(gè)開關(guān)的開閉情況,構(gòu)成了4種不同的排列組合。在這四種排列組合下,由弱引用lo_weak指向的對(duì)象實(shí)例,是否會(huì)被ABAP垃圾回收器回收?結(jié)果如下表:

怎么理解SAP ABAP和Java里的弱引用和軟引用

由此可見,弱引用指向的對(duì)象實(shí)例,在ABAP垃圾回收器啟動(dòng)之后,如果沒有再被至少一個(gè)強(qiáng)引用變量所指向,則會(huì)被垃圾回收器回收。

使用事務(wù)碼s_memory_inspector,在垃圾回收器啟動(dòng)之后制作一個(gè)內(nèi)存快照(Memory Snapshot),發(fā)現(xiàn)在上表第一種排列組合下,lcl_person對(duì)象實(shí)例已經(jīng)被回收了: No memory objects found.

怎么理解SAP ABAP和Java里的弱引用和軟引用

而其他三種排列組合下,lcl_person都逃脫了被垃圾回收器回收的命運(yùn):

怎么理解SAP ABAP和Java里的弱引用和軟引用

Java里也有對(duì)應(yīng)CL_ABAP_WEAK_REFERENCE的弱引用實(shí)現(xiàn):java.lang.ref.WeakReference.

Jerry本文的ABAP程序,翻譯成Java代碼如下:

怎么理解SAP ABAP和Java里的弱引用和軟引用

因?yàn)檫@兩種編程語言的弱引用,工作原理完全一致,所以上面Java版本的例子Jerry就不贅述了。

上面第25行代碼里將強(qiáng)引用變量jerry指向的對(duì)象置為null,第26行啟動(dòng)Java垃圾回收器,于是第27行調(diào)用弱引用變量get方法得到的結(jié)果是:null.

那么這種弱引用有什么使用場(chǎng)景?

最好的學(xué)習(xí)方式就是對(duì)CL_ABAP_WEAK_REFERENCE執(zhí)行Where-used操作,來查找有哪些SAP標(biāo)準(zhǔn)應(yīng)用使用到了這個(gè)類。

在下圖Jerry使用的SAP CRM系統(tǒng)里,弱引用的使用場(chǎng)合還不少。

怎么理解SAP ABAP和Java里的弱引用和軟引用

這500多處使用場(chǎng)景里,最典型的就是緩存(Cache)的實(shí)現(xiàn)場(chǎng)景。下圖這個(gè)CRM增強(qiáng)工具Application Enhancement Tool(簡(jiǎn)稱AET)工廠類的方法GGET_DATA_TYPE_HANDLER, 根據(jù)兩個(gè)輸入?yún)?shù),字段數(shù)據(jù)類型和字段行為類型,返回對(duì)應(yīng)的處理器實(shí)例(handler). 這些處理器實(shí)例化時(shí)需要從若干張數(shù)據(jù)庫表里讀取數(shù)據(jù)并保存在內(nèi)存里,因此初始化過程需要花費(fèi)一定的時(shí)間。為了避免這個(gè)方法每次被調(diào)用時(shí)都花費(fèi)時(shí)間重復(fù)地訪問數(shù)據(jù)庫表,創(chuàng)建新的實(shí)例,該工廠類引入了一個(gè)緩存機(jī)制, 即下圖第21行的內(nèi)表gt_type_handler_cache. 每次GET方法被調(diào)用時(shí),先去該內(nèi)表里查看是否存在對(duì)應(yīng)的處理器實(shí)例。如果有,直接返回,省去了費(fèi)時(shí)的處理器實(shí)例化工作。

怎么理解SAP ABAP和Java里的弱引用和軟引用

看這個(gè)緩存的設(shè)計(jì),行項(xiàng)目的類型結(jié)構(gòu)里,handler的類型并不是具體的IF_AXT_DATATYPE_HANDLER, 而是一個(gè)弱引用。

怎么理解SAP ABAP和Java里的弱引用和軟引用

技術(shù)上說,上圖第七行改成:

handler TYPE REF TO IF_AXT_DATATYPE_HANDLER,也是一種正確的設(shè)計(jì),而且也正是絕大多數(shù)ABAP應(yīng)用人員最常規(guī)的緩存設(shè)計(jì)方案。為討論方便,我將這種大家都常用的方案稱為方案B,而上圖AET工廠類采用弱應(yīng)用指向處理器實(shí)例的方案稱為方案A.

方案A的優(yōu)點(diǎn)是,進(jìn)可攻退可守。

進(jìn)可攻,即如果ABAP垃圾回收器沒有調(diào)用,并且至少存在一個(gè)指向某處理器實(shí)例的強(qiáng)引用,此時(shí)兩種方案運(yùn)行時(shí)沒有大的差異,唯一的細(xì)微區(qū)別之處就是方案A在讀緩存內(nèi)表命中,拿到buffer里存放的弱引用之后,再調(diào)用弱引用的get方法,拿到處理器實(shí)例并返回。而方案B讀緩存內(nèi)表命中后,buffer里存在的就是處理器實(shí)例本身,直接返回給調(diào)用端即可。

退可守,就是一旦程序里再也沒有指向該處理器實(shí)例的強(qiáng)引用,并且ABAP垃圾回收器開始工作,那么弱引用指向的處理器實(shí)例會(huì)被銷毀,釋放了其消耗的內(nèi)存。下次如果GET方法再次調(diào)用,會(huì)從數(shù)據(jù)庫里重新加載數(shù)據(jù),初始化處理器實(shí)例(下圖紅色區(qū)域), 并重新創(chuàng)建弱引用(下圖藍(lán)色區(qū)域)。

怎么理解SAP ABAP和Java里的弱引用和軟引用

一言以蔽之,弱引用CL_ABAP_WEAK_REFERENCE最適合用于描述有一定用處,但不是必需駐留在內(nèi)存里的對(duì)象實(shí)例。因此在SAP CRM很多框架代碼的緩存設(shè)計(jì)上有著廣泛的應(yīng)用。

其實(shí)ABAP除了強(qiáng)引用和弱引用之外,還存在第三種類型的引用:軟引用(CL_ABAP_SOFT_REFERENCE).

怎么理解SAP ABAP和Java里的弱引用和軟引用

同弱引用相比,軟引用指向的對(duì)象,只有當(dāng)沒有被任何強(qiáng)引用指向,且垃圾回收器運(yùn)行時(shí),系統(tǒng)內(nèi)存不足時(shí)才會(huì)被銷毀。系統(tǒng)可用內(nèi)存降低到百分之多少才算是“不足”呢?軟引用并未在ABAP里實(shí)現(xiàn),所以我們也無法繼續(xù)討論下去。

Java里除了弱引用和軟引用之外,還存在PhantomReference(虛引用).

怎么理解SAP ABAP和Java里的弱引用和軟引用

顧名思義,Java里的虛引用就是"形同虛設(shè)",因?yàn)橥ㄟ^虛引用的get方法,獲取到的結(jié)果永遠(yuǎn)為null.

在有的中文資料里,PhantomReference因其這種表現(xiàn)行為,又被翻譯成"幻引用","幽靈引用"。這個(gè)名字讓我想起了《星際爭(zhēng)霸》里人族的幽靈戰(zhàn)機(jī)Wraith.

怎么理解SAP ABAP和Java里的弱引用和軟引用

虛引用主要用來跟蹤對(duì)象實(shí)例被垃圾回收器回收的活動(dòng),必須和引用隊(duì)列(ReferenceQueue)聯(lián)合使用。當(dāng)垃圾回收器準(zhǔn)備回收一個(gè)對(duì)象時(shí),如果發(fā)現(xiàn)還有虛引用指向這個(gè)對(duì)象實(shí)例,就會(huì)在回收該實(shí)例的內(nèi)存之前,把這個(gè)虛引用加入到與之關(guān)聯(lián)的引用隊(duì)列中。

怎么理解SAP ABAP和Java里的弱引用和軟引用

因?yàn)锳BAP里根本沒有虛引用,所以Jerry也不展開敘述了。

感謝各位的閱讀,以上就是“怎么理解SAP ABAP和Java里的弱引用和軟引用”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)怎么理解SAP ABAP和Java里的弱引用和軟引用這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

網(wǎng)站標(biāo)題:怎么理解SAPABAP和Java里的弱引用和軟引用-創(chuàng)新互聯(lián)
本文來源:http://muchs.cn/article28/dhehcp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊(cè)、企業(yè)建站、ChatGPT、標(biāo)簽優(yōu)化、網(wǎng)站維護(hù)、網(wǎng)站導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁設(shè)計(jì)公司