hash運(yùn)算以及分離鎖的機(jī)制。應(yīng)用的性能很重要,為了提高數(shù)據(jù)的讀寫速度,方法之一就是采用緩存機(jī)制,作為核心基礎(chǔ)設(shè)施,緩存必須具備以下幾個(gè)方面的功能:1.快速定位數(shù)據(jù);2.并發(fā)變更數(shù)據(jù);3.數(shù)據(jù)的過(guò)期控制與異步寫入;4.高并發(fā)的情況下緩存數(shù)據(jù)的一致性。ConcurrentHashMap類包含兩個(gè)靜態(tài)內(nèi)部類HashEntry和Segment。HashEntry用來(lái)封裝映射表的鍵/值對(duì);Segment用來(lái)充當(dāng)數(shù)據(jù)劃分和鎖的角色,每個(gè)Segment對(duì)象是整個(gè)散列映射表的若干個(gè)table。每個(gè)table是由若干個(gè)HashEntry對(duì)象鏈接起來(lái)的鏈表。一個(gè)ConcurrentHashMap實(shí)例中包含由若干個(gè)Segment對(duì)象組成的數(shù)組。
[0055]在Android中用到大量的默認(rèn)圖片,比如,應(yīng)用中有默認(rèn)的頭像,默認(rèn)游戲圖標(biāo)等等,這些圖片很多地方會(huì)用到。如果每次都去讀取圖片,由于讀取文件需要硬件操作,速度較慢,會(huì)導(dǎo)致性能降低。因此,可以考慮將圖片緩存起來(lái),需要的時(shí)候直接從內(nèi)存中讀取。但是由于圖片占用內(nèi)存空間比較大,緩存很多圖片需要很多的內(nèi)存,就可能比較容易發(fā)生OutOfMemoryExcept1n異常。這時(shí),可以采用將圖片壓縮或者使用軟引用的方法來(lái)避免這個(gè)問題的發(fā)生。下面將詳細(xì)介紹這兩種方法。
[0056]較大圖片文件上傳到服務(wù)器一般都需要壓縮調(diào)整,以保證數(shù)據(jù)通信的效率是最主要的。首先圖片的存在形式主要有三種,第一種是以文件形式即以二級(jí)制形式存在于硬盤上,第二種是以流的形式即以二進(jìn)制形式存在于內(nèi)存中,第三種則是以Bitmap形式。這三種的區(qū)別是文件形式和流形式對(duì)圖片的體積大小并沒有影響,也就是說(shuō),如果手機(jī)SD卡上的內(nèi)存如果有100K,那么通過(guò)流的形式讀到內(nèi)存中,也一定是占10K的內(nèi)存;當(dāng)如果圖片以Bitmap的形式存在時(shí),其占用的內(nèi)存會(huì)瞬間變大,假如500K文件形式的圖片加載到內(nèi)存,以Bitmap形式存在時(shí),占用內(nèi)存將近10M,當(dāng)然這個(gè)增大的倍數(shù)并不是固定的。Bitmap是Android系統(tǒng)中的圖像處理的最重要的類之一,用它可以獲取圖像文件信息,進(jìn)行圖像剪切、旋轉(zhuǎn)、縮放等操作,并可以指定格式保存圖像文件。
[0057]以下簡(jiǎn)單介紹幾種常見的圖片壓縮方式:
[0058]方式一,將圖片保存到本地時(shí)進(jìn)行壓縮,即將圖片從Bitmap形式變?yōu)镕ile形式時(shí)進(jìn)行壓縮。
[0059]其特點(diǎn)是file形式的圖片確實(shí)被壓縮了,但是當(dāng)重新讀取壓縮后的file為Bitmap時(shí),它占用的內(nèi)存并沒有改變。該方法是壓縮圖片的質(zhì)量,它不會(huì)減少圖片的像素。也就是該方法會(huì)讓圖片重新構(gòu)造,但是有可能像素的色深(即位深)和每個(gè)像素的透明度會(huì)變化,JPEG onlysupports opaque (不透明),也就是說(shuō)以JPEG格式壓縮后,原來(lái)圖片中透明的元素將消失,所以這種格式可能造成失真。既然它是改變了圖片的顯示質(zhì)量,達(dá)到了對(duì)File形式圖片的圖片進(jìn)行壓縮,圖片的像素沒有改變的話,那重新讀取經(jīng)過(guò)壓縮的file為Bitmap時(shí),它占用的內(nèi)存并不會(huì)少。
[0060]方式二,將圖片從本地讀到內(nèi)存時(shí),進(jìn)行壓縮,即圖片從File形式變?yōu)锽itmap形式。
[0061]其特點(diǎn)是通過(guò)設(shè)置采樣率,減少圖片的像素,減少Bitmap的像素,從而減少了它所占用的內(nèi)存。
[0062]以上兩種方法總結(jié)一句話就是要想壓縮內(nèi)存中的Bitmap,就要減少它的像素;要想壓縮為File,就要降低它的質(zhì)量。
[0063]通過(guò)以上對(duì)于Java軟引用類型的了解,可以知道使用軟引用來(lái)構(gòu)建緩存是比較合適的。雖然軟引用能夠延長(zhǎng)數(shù)據(jù)對(duì)象的生命周期,但是對(duì)于移動(dòng)設(shè)備來(lái)說(shuō),內(nèi)存資源相對(duì)來(lái)說(shuō)比較緊缺,僅使用軟引用未必能達(dá)到最佳的緩存效果。通常會(huì)使用一些組合方式來(lái)進(jìn)行數(shù)據(jù)緩存,最常用的是強(qiáng)引用、軟引用加本地緩存的方式。
[0064]采用上述實(shí)施例及優(yōu)選實(shí)施方式的雙緩存處理,通過(guò)創(chuàng)建兩個(gè)緩存區(qū)域:強(qiáng)引用緩存區(qū)域和軟引用緩存區(qū)域。在強(qiáng)引用緩存區(qū)中保存有限的圖片對(duì)象,根據(jù)LRU策略把一些最不常用的圖片對(duì)象移到軟引用緩存區(qū),當(dāng)緩存區(qū)域中都沒有圖片對(duì)象時(shí)從網(wǎng)絡(luò)加載圖片。完成后把圖片數(shù)據(jù)保存到SDCard中,并根據(jù)LRU策略進(jìn)行管理SDCard中保存的圖片文件。
[0065]綜上所述,采用雙緩存,可以實(shí)現(xiàn)內(nèi)存敏感的高速緩存,防止內(nèi)存泄露,增強(qiáng)程序的健壯性。不僅降低了對(duì)內(nèi)存的依賴,實(shí)現(xiàn)內(nèi)存的高速緩存,而且能夠有效防止內(nèi)存泄露,低性能的系統(tǒng)中也能暢快運(yùn)行(用戶體驗(yàn)),數(shù)據(jù)加載速度變快,大大提高了應(yīng)用的穩(wěn)定性(用戶體驗(yàn))。
[0066]顯然,本領(lǐng)域的技術(shù)人員應(yīng)該明白,上述的本發(fā)明的各模塊或各步驟可以用通用的計(jì)算裝置來(lái)實(shí)現(xiàn),它們可以集中在單個(gè)的計(jì)算裝置上,或者分布在多個(gè)計(jì)算裝置所組成的網(wǎng)絡(luò)上,可選地,它們可以用計(jì)算裝置可執(zhí)行的程序代碼來(lái)實(shí)現(xiàn),從而,可以將它們存儲(chǔ)在存儲(chǔ)裝置中由計(jì)算裝置來(lái)執(zhí)行,并且在某些情況下,可以以不同于此處的順序執(zhí)行所示出或描述的步驟,或者將它們分別制作成各個(gè)集成電路模塊,或者將它們中的多個(gè)模塊或步驟制作成單個(gè)集成電路模塊來(lái)實(shí)現(xiàn)。這樣,本發(fā)明不限制于任何特定的硬件和軟件結(jié)合。
[0067]以上所述僅為本發(fā)明的優(yōu)選實(shí)施例而已,并不用于限制本發(fā)明,對(duì)于本領(lǐng)域的技術(shù)人員來(lái)說(shuō),本發(fā)明可以有各種更改和變化。凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。
【主權(quán)項(xiàng)】
1.一種終端內(nèi)存處理方法,其特征在于,包括: 將所述終端內(nèi)存劃分為多個(gè)緩存區(qū)域; 對(duì)所述多個(gè)緩存區(qū)域進(jìn)行分級(jí); 依據(jù)分級(jí)后的所述緩存區(qū)域?qū)λ鼋K端內(nèi)存中的緩存對(duì)象進(jìn)行分級(jí)緩存處理。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,將所述終端內(nèi)存劃分為所述多個(gè)緩存區(qū)域包括: 將所述終端內(nèi)存劃分為一級(jí)緩存區(qū)域和二級(jí)緩存區(qū)域,其中,所述一級(jí)緩存區(qū)域內(nèi)的緩存對(duì)象禁止被垃圾回收器回收,所述二級(jí)緩存區(qū)域內(nèi)的緩存對(duì)象在滿足預(yù)定存儲(chǔ)容量時(shí)被所述垃圾回收器回收。
3.根據(jù)權(quán)利要求2所述的方法,其特征在于,依據(jù)分級(jí)后的所述緩存區(qū)域?qū)λ鼋K端內(nèi)存中的緩存對(duì)象進(jìn)行分級(jí)緩存處理包括: 判斷所述一級(jí)緩存區(qū)域內(nèi)緩存的對(duì)象是否超過(guò)預(yù)定容量; 在判斷結(jié)果為是的情況下,將所述一級(jí)緩存區(qū)域內(nèi)緩存的緩存對(duì)象轉(zhuǎn)換為在所述二級(jí)緩存區(qū)域進(jìn)行緩存。
4.根據(jù)權(quán)利要求3所述的方法,其特征在于,將所述一級(jí)緩存區(qū)域內(nèi)緩存的對(duì)象轉(zhuǎn)換為在所述二級(jí)緩存區(qū)域進(jìn)行緩存包括: 對(duì)所述一級(jí)緩存區(qū)域內(nèi)的緩存對(duì)象依據(jù)訪問量的多少進(jìn)行排序; 優(yōu)先將所述一級(jí)緩存區(qū)域內(nèi)訪問量少的緩存對(duì)象轉(zhuǎn)換為在所述二級(jí)緩存區(qū)域內(nèi)進(jìn)行緩存。
5.根據(jù)權(quán)利要求2至4中任一項(xiàng)所述的方法,其特征在于,所述一級(jí)緩存區(qū)域采用鏈狀哈希映射LinkHashMap容器對(duì)所述一級(jí)緩存區(qū)域內(nèi)的緩存對(duì)象進(jìn)行緩存。
6.根據(jù)權(quán)利要求2至4中任一項(xiàng)所述的方法,其特征在于,所述二級(jí)緩存區(qū)域采用并行哈希映射ConcurrentHashMap容器對(duì)所述二級(jí)緩存區(qū)域內(nèi)的緩存對(duì)象進(jìn)行緩存。
7.—種終端內(nèi)存處理裝置,其特征在于,包括: 劃分模塊,用于將所述終端內(nèi)存劃分為多個(gè)緩存區(qū)域; 分級(jí)模塊,用于對(duì)所述多個(gè)緩存區(qū)域進(jìn)行分級(jí); 緩存模塊,用于依據(jù)分級(jí)后的所述緩存區(qū)域?qū)λ鼋K端內(nèi)存中的緩存對(duì)象進(jìn)行分級(jí)緩存處理。
8.根據(jù)權(quán)利要求7所述的裝置,其特征在于,所述劃分模塊包括: 劃分單元,用于將所述終端內(nèi)存劃分為一級(jí)緩存區(qū)域和二級(jí)緩存區(qū)域,其中,所述一級(jí)緩存區(qū)域內(nèi)的緩存對(duì)象禁止被垃圾回收器回收,所述二級(jí)緩存區(qū)域內(nèi)的緩存對(duì)象在滿足預(yù)定存儲(chǔ)容量時(shí)被所述垃圾回收器回收。
9.根據(jù)權(quán)利要求8所述的裝置,其特征在于,所述緩存模塊包括: 判斷單元,用于判斷所述一級(jí)緩存區(qū)域內(nèi)緩存的對(duì)象是否超過(guò)預(yù)定容量; 轉(zhuǎn)換單元,用于在所述判斷單元的判斷結(jié)果為是的情況下,將所述一級(jí)緩存區(qū)域內(nèi)緩存的緩存對(duì)象轉(zhuǎn)換為在所述二級(jí)緩存區(qū)域進(jìn)行緩存。
10.根據(jù)權(quán)利要求9所述的裝置,其特征在于,所述轉(zhuǎn)換單元包括: 排序子單元,用于對(duì)所述一級(jí)緩存區(qū)域內(nèi)的緩存對(duì)象依據(jù)訪問量的多少進(jìn)行排序; 轉(zhuǎn)換子單元,用于優(yōu)先將所述一級(jí)緩存區(qū)域內(nèi)訪問量少的緩存對(duì)象轉(zhuǎn)換為在所述二級(jí)緩存區(qū)域內(nèi)進(jìn)行緩存。
11.一種終端,其特征在于,包括權(quán)利要求7至10中任一項(xiàng)所述的裝置。
【專利摘要】本發(fā)明提供了一種終端內(nèi)存處理方法、裝置及終端,該方法包括:將終端內(nèi)存劃分為多個(gè)緩存區(qū)域;對(duì)該多個(gè)緩存區(qū)域進(jìn)行分級(jí);依據(jù)分級(jí)后的緩存區(qū)域?qū)K端內(nèi)存中的緩存對(duì)象進(jìn)行分級(jí)緩存處理,通過(guò)本發(fā)明,解決了相關(guān)技術(shù)中存在終端內(nèi)存相對(duì)緊張同時(shí)又對(duì)終端應(yīng)用的用戶體驗(yàn)要求很高的矛盾的問題,進(jìn)而達(dá)到了實(shí)現(xiàn)對(duì)內(nèi)存的高速緩存,有效解決內(nèi)存緊張與應(yīng)用體驗(yàn)相矛盾,提高用戶體驗(yàn)的效果。
【IPC分類】G06F12-08
【公開號(hào)】CN104699626
【申請(qǐng)?zhí)枴緾N201310669799
【發(fā)明人】王正和, 陳華, 陳小強(qiáng), 丁巖
【申請(qǐng)人】中興通訊股份有限公司
【公開日】2015年6月10日
【申請(qǐng)日】2013年12月10日
【公告號(hào)】WO2015085732A1