處理,因此,該二級(jí)緩存區(qū)域可以采用并行哈希映射ConcurrentHashMap容器對(duì)二級(jí)緩存區(qū)域內(nèi)的緩存對(duì)象進(jìn)行緩存。
[0035]在本實(shí)施例中還提供了一種終端內(nèi)存處理裝置,該裝置用于實(shí)現(xiàn)上述實(shí)施例及優(yōu)選實(shí)施方式,已經(jīng)進(jìn)行過說明的不再贅述。如以下所使用的,術(shù)語“模塊”可以實(shí)現(xiàn)預(yù)定功能的軟件和/或硬件的組合。盡管以下實(shí)施例所描述的裝置較佳地以軟件來實(shí)現(xiàn),但是硬件,或者軟件和硬件的組合的實(shí)現(xiàn)也是可能并被構(gòu)想的。
[0036]圖2是根據(jù)本發(fā)明實(shí)施例的終端內(nèi)存處理裝置的結(jié)構(gòu)框圖,如圖2所示,該裝置包括劃分模塊22、分級(jí)模塊24和緩存模塊26,下面對(duì)裝置進(jìn)行說明。
[0037]劃分模塊22,用于將終端內(nèi)存劃分為多個(gè)緩存區(qū)域;分級(jí)模塊24,連接至上述劃分模塊22,用于對(duì)多個(gè)緩存區(qū)域進(jìn)行分級(jí);緩存模塊26,連接至上述分級(jí)模塊24,用于依據(jù)分級(jí)后的緩存區(qū)域?qū)K端內(nèi)存中的緩存對(duì)象進(jìn)行分級(jí)緩存處理。
[0038]圖3是根據(jù)本發(fā)明實(shí)施例的終端內(nèi)存處理裝置中劃分模塊22的結(jié)構(gòu)框圖,如圖3所示,該劃分模塊22包括劃分單元32,下面對(duì)該劃分單元32進(jìn)行說明。
[0039]劃分單元32,用于將終端內(nèi)存劃分為一級(jí)緩存區(qū)域和二級(jí)緩存區(qū)域,其中,一級(jí)緩存區(qū)域內(nèi)的緩存對(duì)象禁止被垃圾回收器回收,二級(jí)緩存區(qū)域內(nèi)的緩存對(duì)象在滿足預(yù)定存儲(chǔ)容量時(shí)被垃圾回收器回收。
[0040]圖4是根據(jù)本發(fā)明實(shí)施例的終端內(nèi)存處理裝置中緩存模塊26的結(jié)構(gòu)框圖,如圖4所示,該緩存模塊26包括判斷單元42和轉(zhuǎn)換單元44,下面對(duì)該緩存模塊26進(jìn)行說明。
[0041]判斷單元42,用于判斷一級(jí)緩存區(qū)域內(nèi)緩存的對(duì)象是否超過預(yù)定容量;轉(zhuǎn)換單元44,連接至上述判斷單元42,用于在判斷單元的判斷結(jié)果為是的情況下,將一級(jí)緩存區(qū)域內(nèi)緩存的緩存對(duì)象轉(zhuǎn)換為在二級(jí)緩存區(qū)域進(jìn)行緩存。
[0042]圖5是根據(jù)本發(fā)明實(shí)施例的終端內(nèi)存處理裝置中緩存模塊26中轉(zhuǎn)換單元44的結(jié)構(gòu)框圖,如圖5所示,該轉(zhuǎn)換單元44包括:排序子單元52和轉(zhuǎn)換子單元54,下面對(duì)該轉(zhuǎn)換單元44進(jìn)行說明。
[0043]排序子單元52,用于對(duì)一級(jí)緩存區(qū)域內(nèi)的緩存對(duì)象依據(jù)訪問量的多少進(jìn)行排序;轉(zhuǎn)換子單元54,連接至上述排序子單元52,用于優(yōu)先將一級(jí)緩存區(qū)域內(nèi)訪問量少的緩存對(duì)象轉(zhuǎn)換為在二級(jí)緩存區(qū)域內(nèi)進(jìn)行緩存。
[0044]在本實(shí)施例中,還提供了一種終端,圖6是根據(jù)本發(fā)明實(shí)施例的終端的結(jié)構(gòu)框圖,如圖6所示,該終端60包括上述任一項(xiàng)的終端內(nèi)存處理裝置62。
[0045]像訪問磁盤文件、訪問網(wǎng)絡(luò)資源、查詢數(shù)據(jù)庫等操作都是影響應(yīng)用程序執(zhí)行性能的重要因素,如果能重新獲取那些尚未被回收的Java對(duì)象的引用,必將減少不必要的訪問,大大提高程序的運(yùn)行速度。因此,在本實(shí)施例中基于終端(例如,手機(jī))內(nèi)存相對(duì)緊張同時(shí)又對(duì)手機(jī)應(yīng)用的用戶體驗(yàn)要求很高的矛盾,即在面對(duì)手機(jī)終端內(nèi)存一定的情況下,對(duì)手機(jī)應(yīng)用的用戶響應(yīng)性與手機(jī)應(yīng)用的健壯性都提出了很高的要求。在本實(shí)施例中,在內(nèi)存一定的前提下做到充分利用現(xiàn)有內(nèi)存基礎(chǔ)上構(gòu)建應(yīng)用的二級(jí)緩存并且做到有效避免內(nèi)存緩存OutOfMemoryExcept1n發(fā)生。例如,對(duì)圖片緩存采用該緩存策略后就可以達(dá)到很高的用戶體驗(yàn)。
[0046]下面對(duì)本發(fā)明實(shí)施例的雙緩存方案進(jìn)行描述,便于以下敘述,以下以終端內(nèi)存消耗比較突出的圖片為例進(jìn)行說明,該方案主要包括以下幾點(diǎn):1、使用JAVA的強(qiáng)引用構(gòu)建應(yīng)用的一級(jí)緩存;2、JAVA軟引用構(gòu)建二級(jí)緩存;3、借助JAVA提供的LinkHashMap類實(shí)現(xiàn)近期最少使用(Least Recently Used,簡稱為LRU)算法和一級(jí)緩存容器;4、在一級(jí)與二級(jí)緩存之間動(dòng)態(tài)雙向轉(zhuǎn)換;5、根據(jù)手機(jī)終端內(nèi)存大小動(dòng)態(tài)修改一級(jí)緩存大??;6、使用JAVA提供的ConcurrentHashMap實(shí)現(xiàn)二級(jí)緩存容器;7、提供壓縮后緩存策略。
[0047]通過本發(fā)明實(shí)施例,根據(jù)JAVA自有垃圾回收器的特性對(duì)需要緩存的對(duì)象使用強(qiáng)引用構(gòu)建的一級(jí)緩存,采用軟引用構(gòu)建二級(jí)緩存,再根據(jù)LRU算法動(dòng)態(tài)轉(zhuǎn)換一、二級(jí)緩存中的對(duì)象,這樣雙管齊下,不僅增強(qiáng)了頁面瀏覽的流暢從而大大增強(qiáng)用戶體驗(yàn),并且有效的降低了 OutOfMemoryExcept1n異常發(fā)生的機(jī)率,從而使我們的應(yīng)用在如今競(jìng)爭相當(dāng)激勵(lì)移動(dòng)互聯(lián)網(wǎng)應(yīng)用中能夠脫穎而出,得到用戶的青睞最終贏得市場(chǎng)。
[0048]下面對(duì)本發(fā)明的優(yōu)選實(shí)施方式進(jìn)行說明。
[0049]在本優(yōu)選實(shí)施方式中,首先,根據(jù)手機(jī)終端內(nèi)存的大小創(chuàng)建一個(gè)合適大小的強(qiáng)引用緩存區(qū)域,在強(qiáng)引用緩存區(qū)域所存放的對(duì)象在垃圾回收時(shí)不會(huì)主動(dòng)被回收,即只要不主動(dòng)釋放就會(huì)貫穿應(yīng)用的整個(gè)生命周期,所以這里的引用緩存就構(gòu)成上述所說的一級(jí)緩存,在一級(jí)緩存里存放應(yīng)用中經(jīng)常使用到的對(duì)象(例如,圖片數(shù)據(jù))。由于一級(jí)緩存的支撐,用戶在使用時(shí)就不會(huì)感覺到應(yīng)用頁面的滯后。但由于物理內(nèi)存大小限制一級(jí)緩存容量是有限的,所以引入采用軟引用構(gòu)建的不限大小的二級(jí)緩存區(qū)域,軟引用區(qū)域主要用來存放一級(jí)緩存區(qū)域根據(jù)LRU算法淘汰下來的圖片資源,隨著應(yīng)用的運(yùn)行,從一級(jí)緩存淘汰時(shí)二級(jí)緩存的圖片資源將會(huì)越來越多,當(dāng)內(nèi)存大到超出物理內(nèi)存總和后就會(huì)發(fā)生OutOfMemoryExcept1n異常,這樣就違背了應(yīng)用的健壯性。因此,在本優(yōu)選實(shí)施方式中構(gòu)建的二級(jí)緩存采用的JAVA的軟引用,根據(jù)軟引用的特性在JAVA垃圾回收器發(fā)生的時(shí)候會(huì)動(dòng)態(tài)決定是否回收軟件用所指對(duì)象占用的內(nèi)存,當(dāng)內(nèi)存到達(dá)物理內(nèi)存極限的時(shí)候就會(huì)強(qiáng)行回收軟引用對(duì)象所占用的內(nèi)存,如果尚有足夠支撐應(yīng)用運(yùn)行內(nèi)存,垃圾回收器就會(huì)忽略軟引用對(duì)象,由于軟引用這個(gè)獨(dú)特性質(zhì),所以可以有效避免常見的OutOfMemoryExcept1n異常的發(fā)生,這樣就大大提高了應(yīng)用的健壯性。在構(gòu)建一級(jí)緩存的容器時(shí),主要采用了 JAVA提供的LinkHashMap類,之所以采用這樣的容器是因?yàn)樵趹?yīng)用不斷使用的時(shí)候會(huì)不斷將后續(xù)的圖片資源根據(jù)LRU算法轉(zhuǎn)移至二級(jí)緩存,LinkHashMap該類本身存在一個(gè)特性就是可以動(dòng)態(tài)設(shè)置屬性根據(jù)訪問高低將容器中的對(duì)象進(jìn)行排序,所以借助這個(gè)類只需要實(shí)現(xiàn)一級(jí)緩存向二級(jí)緩存移動(dòng)的便捷操作,將實(shí)現(xiàn)LRU算法難度大大降低。在實(shí)現(xiàn)二級(jí)緩存時(shí)我們采用了 JAVA中提供的ConcurrentHashMap類,由于現(xiàn)在的一般應(yīng)用都是多線程訪問,所以這就要求考慮容器的同步安全問題,當(dāng)然JAVA中多線程安全的容器還有很多,如Vector、HashTable等,但是這些類實(shí)現(xiàn)多線程安裝用的整個(gè)方法加上內(nèi)部鎖實(shí)現(xiàn),而ConcurrentHashMap采用的是分離鎖,所以使用ConcurrentHashMap能夠達(dá)到更好的吞吐量。在最后對(duì)于緩存的對(duì)象提供了壓縮后緩存策略,這一點(diǎn)可以根據(jù)后續(xù)的測(cè)試充分考慮響應(yīng)與性能兼顧的前提下決定是否采用壓縮后緩存。
[0050]需要說明的是,上述所指的強(qiáng)引用(StrongReference)是使用最普遍的引用。如果一個(gè)對(duì)象具有強(qiáng)引用,那垃圾回收器絕不會(huì)回收它。當(dāng)內(nèi)存空間不足,Java虛擬機(jī)寧愿拋出OutOfMemoryError錯(cuò)誤,使程序異常終止,也不會(huì)靠隨意回收具有強(qiáng)引用的對(duì)象來解決內(nèi)存不足的問題。因此,在本優(yōu)選實(shí)施例中,采用強(qiáng)引用來實(shí)現(xiàn)一級(jí)緩存,但是當(dāng)應(yīng)用從網(wǎng)絡(luò)中獲取網(wǎng)絡(luò)圖片數(shù)據(jù)時(shí),用戶完全有可能做一些重復(fù)性的操作去查看相同的圖片信息。
[0051]另外,如果一個(gè)對(duì)象只具有軟引用,則內(nèi)存空間足夠,垃圾回收器就不會(huì)回收它;如果內(nèi)存空間不足了,就會(huì)回收這些對(duì)象的內(nèi)存。只要垃圾回收器沒有回收它,該對(duì)象就可以被程序使用。軟引用可用來實(shí)現(xiàn)內(nèi)存敏感的高速緩存。使用軟引用(SoftReference)實(shí)現(xiàn)二級(jí)緩存是非常有必要的一件事情。在處理大量圖片的時(shí)候,使用軟引用技術(shù)可以來防止內(nèi)存溢出。在Android開發(fā)中,為了防止內(nèi)存溢出,在處理一些占用一些內(nèi)存大而且聲明周期較長的對(duì)象的時(shí)候,可以盡量使用軟引用技術(shù)。使用軟引用以后,在OutOfMemory異常發(fā)生之前,這些緩存的圖片資源的內(nèi)存空間是可以被釋放掉的,從而避免內(nèi)存達(dá)到上限,避免內(nèi)存溢出的發(fā)生。
[0052]雖然軟引用在內(nèi)存空間足夠的時(shí)候使用起來比較方便,而在內(nèi)存空間不足的時(shí)候就不能使用軟引用,因?yàn)殡S時(shí)都可能被垃圾回收器回收。因此,在Android開發(fā)中可以使用LRU+軟引用的方法來緩存圖片設(shè)置兩級(jí)緩存,第一級(jí)用LinkedHashMap〈String, Bitmap)保留Bitmap的強(qiáng)引用,但是控制緩存的大小MAX_CAPACITY=10,當(dāng)繼續(xù)向該緩存中存數(shù)據(jù)的時(shí)候,將會(huì)把一級(jí)緩存中的最近最少使用的元素放入二級(jí)緩存ConcurrentHashMap〈Sting, SoftReference〈Bitmap>>, 二級(jí)緩存中保留的Bitmap的軟引用。
[0053]把圖片保存到LRU集合中的時(shí)候,同時(shí)保存在一個(gè)軟引用的集合之中,如果此元素被LRU算法刪除,可能垃圾回收器還并沒有回收,可以通過軟引用的集合獲取到此引用。
[0054]需要說明的是,LinkedHashMap繼承了 HashMap底層是通過Hash表+單向鏈表實(shí)現(xiàn)Hash算法,內(nèi)部自己維護(hù)了一套元素訪問順序的列表。ConcurrentHashMap的并發(fā)讀寫速度很快,主要?dú)w功于其內(nèi)部數(shù)據(jù)結(jié)構(gòu)和獨(dú)特的