本發(fā)明涉及信息技術(shù)領(lǐng)域,尤其涉及一種內(nèi)存回收方法及裝置。
背景技術(shù):
隨著終端(如智能手機(jī)、平板電腦等終端)的發(fā)展,終端已成為人們?nèi)粘I畋夭豢扇钡奈锲?。?shí)踐中發(fā)現(xiàn),用戶在剛開始購(gòu)買終端的時(shí)候,用戶使用終端非常順滑,應(yīng)用運(yùn)行起來(lái)非??欤诮K端被長(zhǎng)期使用后,由于安裝的應(yīng)用越來(lái)越多,會(huì)有許多無(wú)用進(jìn)程和服務(wù)在后臺(tái)運(yùn)行,并且用戶瀏覽網(wǎng)頁(yè)以及使用應(yīng)用程序(application,app)會(huì)產(chǎn)生過(guò)多的緩存,這些將會(huì)使得系統(tǒng)的可用內(nèi)存變少,進(jìn)而導(dǎo)致終端出現(xiàn)卡頓現(xiàn)象。
通常采取的做法是在系統(tǒng)分配內(nèi)存時(shí)檢查系統(tǒng)是否有充足的可用內(nèi)存,若發(fā)現(xiàn)當(dāng)前系統(tǒng)的可用內(nèi)存不能支撐當(dāng)前的內(nèi)存分配需求,則會(huì)啟動(dòng)系統(tǒng)內(nèi)存清理操作,比如:回收系統(tǒng)緩存、關(guān)閉進(jìn)程等。然而,這樣會(huì)導(dǎo)致需要內(nèi)存資源的應(yīng)用阻塞,處于等待狀態(tài),延長(zhǎng)了app的響應(yīng)時(shí)間,進(jìn)而增大了終端出現(xiàn)卡頓現(xiàn)象的概率。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明實(shí)施例提供了一種內(nèi)存回收方法及裝置,可以減少終端出現(xiàn)卡頓現(xiàn)象的概率。
本發(fā)明實(shí)施例第一方面公開了一種內(nèi)存回收方法,包括:
在確定系統(tǒng)當(dāng)前的可用內(nèi)存小于內(nèi)存閾值時(shí),從后臺(tái)進(jìn)程列表中確定待回收內(nèi)存的進(jìn)程,其中,所述后臺(tái)進(jìn)程列表包括一個(gè)或多個(gè)應(yīng)用的進(jìn)程,所述待回收內(nèi)存的進(jìn)程為所述一個(gè)或多個(gè)應(yīng)用的進(jìn)程中滿足進(jìn)程所占用內(nèi)存與內(nèi)存壓力值的差值的絕對(duì)值小于預(yù)設(shè)閾值的條件的進(jìn)程,所述內(nèi)存壓力值為所述內(nèi)存閾值與所述系統(tǒng)當(dāng)前的可用內(nèi)存的差值;向系統(tǒng)內(nèi)核發(fā)送處理指令,以觸發(fā)所述系統(tǒng)內(nèi)核對(duì)所述待回收內(nèi)存的進(jìn)程進(jìn)行處理以回收所述待回收內(nèi)存的進(jìn)程所占用的內(nèi)存。
其中,可以由一個(gè)或多個(gè)內(nèi)存管控線程、一個(gè)或多個(gè)內(nèi)存管控進(jìn)程、應(yīng)用中的任一個(gè)來(lái)執(zhí)行上述方法的步驟。
其中,后臺(tái)進(jìn)程列表是一個(gè)根據(jù)應(yīng)用的重要程度以及進(jìn)程優(yōu)先級(jí)進(jìn)行排序的動(dòng)態(tài)二維表,包括一個(gè)或多個(gè)應(yīng)用的進(jìn)程,即后臺(tái)進(jìn)程列表可以包括一個(gè)或多個(gè)應(yīng)用,同時(shí),一個(gè)應(yīng)用可以包括一個(gè)或多個(gè)進(jìn)程。該后臺(tái)進(jìn)程列表在2種情況下創(chuàng)建,第一種:在確定系統(tǒng)當(dāng)前的可用內(nèi)存小于內(nèi)存閾值時(shí)創(chuàng)建后臺(tái)進(jìn)程列表,這種情況一般是針對(duì)需要立即進(jìn)行內(nèi)存回收的場(chǎng)景,第二種:在確定系統(tǒng)當(dāng)前的可用內(nèi)存小于內(nèi)存閾值并且系統(tǒng)處于空閑狀態(tài)時(shí)創(chuàng)建后臺(tái)進(jìn)程列表,這種情況一般是用戶和終端進(jìn)行交互,為了不影響用戶體驗(yàn),需要在系統(tǒng)空閑的時(shí)候進(jìn)行內(nèi)存回收。
具體的,本發(fā)明實(shí)施例中,在確定系統(tǒng)當(dāng)前的可用內(nèi)存小于內(nèi)存閾值時(shí),可以制定內(nèi)存回收策略,根據(jù)該內(nèi)存回收策略,從后臺(tái)進(jìn)程列表中確定待回收內(nèi)存的進(jìn)程,進(jìn)一步地,向系統(tǒng)內(nèi)核發(fā)送處理指令,以觸發(fā)系統(tǒng)內(nèi)核對(duì)待回收內(nèi)存的進(jìn)程進(jìn)行處理以回收待回收內(nèi)存的進(jìn)程對(duì)應(yīng)的內(nèi)存,直到緩解系統(tǒng)當(dāng)前的內(nèi)存壓力。
此外,由于應(yīng)用之間存在各種關(guān)聯(lián)關(guān)系,在對(duì)后臺(tái)進(jìn)程所占用的內(nèi)存進(jìn)行回收時(shí),為了防止被清理的進(jìn)程被其關(guān)聯(lián)的進(jìn)程拉起來(lái),所以,在回收內(nèi)存時(shí)是以應(yīng)用為單位,回收該應(yīng)用包括的進(jìn)程所占用的內(nèi)存。其中,進(jìn)程所占用的內(nèi)存是指該進(jìn)程獨(dú)立占用的那部分內(nèi)存,而不包括該進(jìn)程與其他進(jìn)程共享的那部分內(nèi)存。
可見,這種方式中,在確定系統(tǒng)當(dāng)前的可用內(nèi)存小于內(nèi)存閾值時(shí),可以主動(dòng)進(jìn)行內(nèi)存回收,當(dāng)應(yīng)用程序真正需要大量?jī)?nèi)存的時(shí)候,系統(tǒng)內(nèi)核已經(jīng)回收回來(lái)大量可用的內(nèi)存,從而可以減少終端出現(xiàn)卡頓現(xiàn)象的概率。
在一個(gè)可能的實(shí)施方式中,在檢測(cè)到第一關(guān)鍵事件時(shí)觸發(fā)所述確定系統(tǒng)當(dāng)前的可用內(nèi)存小于內(nèi)存閾值的操作,且所述內(nèi)存閾值為與所述第一關(guān)鍵事件對(duì)應(yīng)的第一內(nèi)存閾值。其中,該內(nèi)存閾值可以是靜態(tài)預(yù)置的,也可以是動(dòng)態(tài)配置的。不同的第一關(guān)鍵事件對(duì)應(yīng)的場(chǎng)景是不同的,相應(yīng)的第一內(nèi)存閾值也不同。
在一個(gè)可能的實(shí)施方式中,所述第一關(guān)鍵事件包括如下事件中的任意一種:程序啟動(dòng)開始事件、清理事件以及內(nèi)存不足oom事件。其中,當(dāng)發(fā)生第一關(guān)鍵事件時(shí)需要立即進(jìn)行內(nèi)存回收。
在一個(gè)可能的實(shí)施方式中,在檢測(cè)到第二關(guān)鍵事件且確定系統(tǒng)處于空閑狀態(tài)時(shí)觸發(fā)所述確定當(dāng)前系統(tǒng)的可用內(nèi)存小于內(nèi)存閾值的操作,且所述內(nèi)存閾值為與所述第二關(guān)鍵事件對(duì)應(yīng)的第二內(nèi)存閾值。其中,該內(nèi)存閾值可以是靜態(tài)預(yù)置的,也可以是動(dòng)態(tài)配置的。不同的第二關(guān)鍵事件對(duì)應(yīng)的場(chǎng)景是不同的,相應(yīng)的第二內(nèi)存閾值也不同。
其中,在該實(shí)施方式中,步驟的先后順序是:在檢測(cè)到第二關(guān)鍵事件時(shí)先判斷系統(tǒng)是否處于空閑狀態(tài),在確定系統(tǒng)處于空閑狀態(tài)時(shí)再去讀取當(dāng)前系統(tǒng)的可用內(nèi)存,在確定當(dāng)前系統(tǒng)的可用內(nèi)存小于內(nèi)存閾值時(shí),從后臺(tái)進(jìn)程列表中確定待回收內(nèi)存的進(jìn)程,進(jìn)一步地,向系統(tǒng)內(nèi)核發(fā)送處理指令,以觸發(fā)系統(tǒng)內(nèi)核對(duì)待回收內(nèi)存的進(jìn)程進(jìn)行處理以回收待回收內(nèi)存的進(jìn)程對(duì)應(yīng)的內(nèi)存。
在一個(gè)可能的實(shí)施方式中,在檢測(cè)到第二關(guān)鍵事件時(shí)觸發(fā)所述確定當(dāng)前系統(tǒng)的可用內(nèi)存小于內(nèi)存閾值的操作,在確定系統(tǒng)處于空閑狀態(tài)時(shí)觸發(fā)所述從后臺(tái)進(jìn)程列表中選擇待回收內(nèi)存的進(jìn)程的操作,且所述內(nèi)存閾值為與所述第二關(guān)鍵事件對(duì)應(yīng)的第二內(nèi)存閾值。
其中,在該實(shí)施方式中,步驟的先后順序是:在檢測(cè)到第二關(guān)鍵事件時(shí),先讀取當(dāng)前系統(tǒng)的可用內(nèi)存,在確定當(dāng)前系統(tǒng)的可用內(nèi)存小于內(nèi)存閾值的情況下,再判斷系統(tǒng)是否處于空閑狀態(tài),在確定系統(tǒng)處于空閑狀態(tài)時(shí)從后臺(tái)進(jìn)程列表中選擇待回收內(nèi)存的進(jìn)程,進(jìn)一步地,向系統(tǒng)內(nèi)核發(fā)送處理指令,以觸發(fā)系統(tǒng)內(nèi)核對(duì)待回收內(nèi)存的進(jìn)程進(jìn)行處理以回收待回收內(nèi)存的進(jìn)程對(duì)應(yīng)的內(nèi)存。
在一個(gè)可能的實(shí)施方式中,所述第二關(guān)鍵事件包括如下事件中的任意一種:程序啟動(dòng)完成事件、亮屏事件、滅屏事件、觸屏事件、界面切換事件、任務(wù)切換完成事件以及廣播事件。
在一個(gè)可能的實(shí)施方式中,所述確定系統(tǒng)處于空閑狀態(tài)包括:
判斷所述系統(tǒng)當(dāng)前的負(fù)載是否小于負(fù)載閾值;在所述系統(tǒng)當(dāng)前的負(fù)載小于所述負(fù)載閾值的情況下,確定系統(tǒng)處于空閑狀態(tài)。
其中,系統(tǒng)處于空閑狀態(tài)有2種場(chǎng)景,第一種是在用戶未使用終端的情況下,比如終端處于待機(jī)狀態(tài)可以看作是系統(tǒng)處于空閑狀態(tài),又比如:在應(yīng)用啟動(dòng)完成出現(xiàn)顯示畫面,但以后并沒(méi)有和終端進(jìn)行交互,這個(gè)時(shí)候系統(tǒng)沒(méi)有大量的io操作,可以看作是系統(tǒng)處于空閑狀態(tài),第二種是在用戶使用終端但系統(tǒng)當(dāng)前的負(fù)載不影響用戶體驗(yàn)的情況下,可以看作是系統(tǒng)處于空閑狀態(tài),比如系統(tǒng)的負(fù)載小于負(fù)載閾值。
在一個(gè)可能的實(shí)施方式中,在確定出的所述待回收的進(jìn)程為多個(gè)的情況下,所述向系統(tǒng)內(nèi)核發(fā)送處理指令包括:
調(diào)用多個(gè)線程向系統(tǒng)內(nèi)核發(fā)送多個(gè)處理指令,其中,每個(gè)所述線程用于發(fā)送一個(gè)或多個(gè)處理指令。
其中,確定出的待回收的進(jìn)程可以為一個(gè)也可以為多個(gè),在一個(gè)進(jìn)程需要發(fā)送多個(gè)處理指令的情況下,該進(jìn)程可以一個(gè)一個(gè)連續(xù)地發(fā)送處理指令,而不需要在發(fā)送完一個(gè)處理指令后去檢測(cè)系統(tǒng)內(nèi)核回收進(jìn)程對(duì)應(yīng)的內(nèi)存的狀態(tài),然后再去發(fā)送另一個(gè)處理指令。
在該可選的實(shí)施方式中,在確定出的所述待回收的進(jìn)程為多個(gè)的情況下,可以調(diào)用多個(gè)線程向系統(tǒng)內(nèi)核發(fā)送多個(gè)處理指令。具體的,一個(gè)線程發(fā)送多個(gè)處理指令是指該線程一個(gè)一個(gè)連續(xù)地發(fā)送處理指令,而不需要在發(fā)送完一個(gè)處理指令后去檢測(cè)系統(tǒng)內(nèi)核回收進(jìn)程對(duì)應(yīng)的內(nèi)存的狀態(tài),然后再去發(fā)送另一個(gè)處理指令。其中,每個(gè)處理指令攜帶一個(gè)待回收的進(jìn)程的標(biāo)識(shí)。
可見,這種方式可以提高線程向系統(tǒng)內(nèi)核發(fā)送處理指令的效率,同時(shí),也可以加速系統(tǒng)內(nèi)核回收內(nèi)存性能。
在一個(gè)可能的實(shí)施方式中,所述從后臺(tái)進(jìn)程列表中確定待回收內(nèi)存的進(jìn)程包括:
根據(jù)應(yīng)用的重要程度從低到高的順序,從所述后臺(tái)進(jìn)程列表包括的多個(gè)應(yīng)用中確定至少一個(gè)應(yīng)用;根據(jù)進(jìn)程優(yōu)先級(jí)從低到高的順序,從所述至少一個(gè)應(yīng)用包括的進(jìn)程中確定待回收內(nèi)存的進(jìn)程。
在一個(gè)可能的實(shí)施方式中,所述方法還包括:
在確定所述系統(tǒng)當(dāng)前的可用內(nèi)存小于所述內(nèi)存閾值時(shí)創(chuàng)建所述后臺(tái)進(jìn)程列表。其中,這種情況是針對(duì)需要立即進(jìn)行內(nèi)存回收的場(chǎng)景而言的。
在一個(gè)可能的實(shí)施方式中,所述方法還包括:
在確定所述系統(tǒng)當(dāng)前的可用內(nèi)存小于所述內(nèi)存閾值并且所述系統(tǒng)處于空閑狀態(tài)時(shí)創(chuàng)建所述后臺(tái)進(jìn)程列表。其中,這種情況是針對(duì)用戶和終端進(jìn)行交互,為了不影響用戶體驗(yàn),需要在系統(tǒng)空閑的時(shí)候進(jìn)行內(nèi)存回收的場(chǎng)景而言的。
在一個(gè)可能的實(shí)施方式中,所述創(chuàng)建所述后臺(tái)進(jìn)程列表包括:
確定當(dāng)前在后臺(tái)運(yùn)行的每個(gè)應(yīng)用的關(guān)鍵因素的分值,所述關(guān)鍵因素包括以下中的一個(gè)或多個(gè):進(jìn)程優(yōu)先級(jí)、用戶使用習(xí)慣、進(jìn)程占用系統(tǒng)資源以及應(yīng)用的關(guān)聯(lián)關(guān)系;針對(duì)每個(gè)所述應(yīng)用,將所有所述關(guān)鍵因素的分值進(jìn)行加權(quán)計(jì)算,獲得所述應(yīng)用的重要程度;根據(jù)所有所述應(yīng)用的重要程度,對(duì)所有所述應(yīng)用進(jìn)行排序;根據(jù)進(jìn)程優(yōu)先級(jí),對(duì)排序后的每個(gè)所述應(yīng)用包括的進(jìn)程進(jìn)行排序,以生成后臺(tái)進(jìn)程列表。
其中,系統(tǒng)資源可以包括但不限于計(jì)算資源,存儲(chǔ)資源,cpu資源以及io資源?;趹?yīng)用的關(guān)鍵因素(進(jìn)程優(yōu)先級(jí)、用戶使用習(xí)慣、進(jìn)程占用系統(tǒng)資源以及應(yīng)用的關(guān)聯(lián)關(guān)系)來(lái)創(chuàng)建后臺(tái)進(jìn)程列表,后續(xù)就可以根據(jù)內(nèi)存的需求從該后臺(tái)進(jìn)程列表中確定需要處理的進(jìn)程,這樣就可以精確地選擇可殺進(jìn)程隊(duì)列,減少錯(cuò)殺/多殺/少殺進(jìn)程的概率。
本發(fā)明實(shí)施例第二方面公開了一種內(nèi)存回收裝置,包括用于執(zhí)行本發(fā)明實(shí)施例第一方面任一方法的部分或全部步驟的功能單元。其中,該終端執(zhí)行第一方面任一方法的部分或全部步驟時(shí)可以減少終端出現(xiàn)卡頓現(xiàn)象的概率。
本發(fā)明實(shí)施例第三方面公開了一種終端,包括處理器以及存儲(chǔ)器,所述存儲(chǔ)器被配置用于存儲(chǔ)指令,所述處理器被配置用于運(yùn)行所述指令,所述處理器運(yùn)行所述指令以執(zhí)行本發(fā)明實(shí)施例第一方面任一方法的部分或全部步驟。其中,該終端執(zhí)行第一方面任一方法的部分或全部步驟時(shí)可以減少終端出現(xiàn)卡頓現(xiàn)象的概率。
本發(fā)明實(shí)施例第四方面公開了一種計(jì)算機(jī)存儲(chǔ)介質(zhì),所述計(jì)算機(jī)存儲(chǔ)介質(zhì)存儲(chǔ)有程序,所述程序具體包括用于執(zhí)行本發(fā)明實(shí)施例第一方面任一方法的部分或全部步驟的指令。
附圖說(shuō)明
為了更清楚地說(shuō)明本發(fā)明實(shí)施例中的技術(shù)方案,下面將對(duì)實(shí)施例描述中所需要使用的附圖作簡(jiǎn)單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實(shí)施例,對(duì)于本領(lǐng)域普通技術(shù)人員來(lái)講,在不付出創(chuàng)造性勞動(dòng)的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
圖1是本發(fā)明實(shí)施例公開的一種操作系統(tǒng)的結(jié)構(gòu)示意圖;
圖2是本發(fā)明實(shí)施例公開的一種內(nèi)存回收方法的流程示意圖;
圖2a是本發(fā)明實(shí)施例公開的一種app重要程度識(shí)別的示意圖;
圖2b是本發(fā)明實(shí)施例公開的一種應(yīng)用的關(guān)聯(lián)關(guān)系的示意圖;
圖2c是本發(fā)明實(shí)施例公開的一種相機(jī)啟動(dòng)時(shí)序圖;
圖2d是本發(fā)明實(shí)施例公開的另一種相機(jī)啟動(dòng)時(shí)序圖;
圖3是本發(fā)明實(shí)施例公開的另一種內(nèi)存回收方法的流程示意圖;
圖4是本發(fā)明實(shí)施例公開的另一種內(nèi)存回收方法的流程示意圖;
圖5是本發(fā)明實(shí)施例公開的一種內(nèi)存回收裝置的結(jié)構(gòu)示意圖;
圖6是本發(fā)明實(shí)施例公開的一種終端的結(jié)構(gòu)示意圖。
具體實(shí)施方式
下面將結(jié)合本發(fā)明實(shí)施例中的附圖,對(duì)本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例僅僅是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例?;诒景l(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒(méi)有做出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。
本發(fā)明的說(shuō)明書和權(quán)利要求書及上述附圖中的術(shù)語(yǔ)“包括”和“具有”以及它們?nèi)魏巫冃危鈭D在于覆蓋不排他的包含。例如包含了一系列步驟或單元的過(guò)程、方法、系統(tǒng)、產(chǎn)品或設(shè)備沒(méi)有限定于已列出的步驟或單元,而是可選地還包括沒(méi)有列出的步驟或單元,或可選地還包括對(duì)于這些過(guò)程、方法、產(chǎn)品或設(shè)備固有的其它步驟或單元。
本發(fā)明實(shí)施例公開了一種內(nèi)存回收方法及裝置,可以減少終端出現(xiàn)卡頓現(xiàn)象的概率。以下分別進(jìn)行詳細(xì)說(shuō)明。
本發(fā)明實(shí)施例提供的內(nèi)存回收方法主要應(yīng)用于終端,該終端也可稱之為用戶設(shè)備(userequipment,簡(jiǎn)稱為“ue”)、移動(dòng)臺(tái)(mobilestation,簡(jiǎn)稱為“ms”)、移動(dòng)終端(mobileterminal)等,可選的,該終端可以具備經(jīng)無(wú)線接入網(wǎng)(radioaccessnetwork,ran)與一個(gè)或多個(gè)核心網(wǎng)進(jìn)行通信的能力,例如,終端可以是移動(dòng)電話(或稱為“蜂窩”電話)、或具有移動(dòng)性質(zhì)的計(jì)算機(jī)等,例如,終端還可以是便攜式、袖珍式、手持式、計(jì)算機(jī)內(nèi)置的或者車載的移動(dòng)裝置。該終端的操作系統(tǒng)可包括但不限于android(安卓)操作系統(tǒng)、ios操作系統(tǒng)、symbian(塞班)操作系統(tǒng)、blackberry(黑莓)操作系統(tǒng)、windowsphone8操作系統(tǒng)等等。
本發(fā)明實(shí)施例提供的內(nèi)存回收方法主要應(yīng)用于具有android操作系統(tǒng)的終端。
為了更好的理解本發(fā)明實(shí)施例,下面先對(duì)本發(fā)明實(shí)施例公開的一種操作系統(tǒng)的結(jié)構(gòu)示意圖進(jìn)行描述。
請(qǐng)參閱圖1,圖1是本發(fā)明實(shí)施例公開的一種操作系統(tǒng)的結(jié)構(gòu)示意圖。具體的,該操作系統(tǒng)可以是android操作系統(tǒng)。android操作系統(tǒng)是google開發(fā)的基于linux平臺(tái)的開源操作系統(tǒng),android操作系統(tǒng)是一個(gè)分層的環(huán)境,構(gòu)建在linux內(nèi)核的基礎(chǔ)上,它包括豐富的功能。
如圖1所示,該操作系統(tǒng)100包括應(yīng)用層110、框架層120、核心庫(kù)層130以及內(nèi)核層140。
其中,應(yīng)用層110包括終端工作時(shí)所需的所有應(yīng)用程序,比如電子郵件客戶端、短信、日歷、地圖、瀏覽器等應(yīng)用程序,這些應(yīng)用程序可以由java、c/c++等語(yǔ)言編寫。
框架層120即為android應(yīng)用程序框架,android應(yīng)用程序均是基于該框架進(jìn)行開發(fā)的。該框架通過(guò)提供一組基礎(chǔ)類庫(kù),可以使開發(fā)者開發(fā)出豐富且新穎的應(yīng)用程序,基于該類庫(kù),開發(fā)者可以自由地利用設(shè)備硬件優(yōu)勢(shì),實(shí)現(xiàn)訪問(wèn)位置信息,運(yùn)行后臺(tái)服務(wù),設(shè)置鬧鐘,向狀態(tài)欄添加通知等功能。需要說(shuō)明的是,圖1所示的框架層120保留了原有android操作系統(tǒng)框架層的功能模塊,此外,在系統(tǒng)服務(wù)121上做了一些修改,如圖1所示,本發(fā)明中,該系統(tǒng)服務(wù)121包括資源管理系統(tǒng)(resourcemanagementsystem,rms)模塊1211、應(yīng)用管控模塊1212以及系統(tǒng)資源狀態(tài)采集模塊1213,其中,rms模塊1211主要用于對(duì)系統(tǒng)資源狀態(tài)采集模塊1213采集的信息進(jìn)行管理,應(yīng)用管控模塊1212主要用于對(duì)進(jìn)程快速處理,系統(tǒng)資源狀態(tài)采集模塊1213主要用于采集并識(shí)別系統(tǒng)的資源負(fù)載狀態(tài)。此外,如圖1所示,在該框架層120中新增了感知進(jìn)程122,感知進(jìn)程122包括rms模塊1221、省電精靈模塊1222以及內(nèi)存管控模塊1223,其中,rms模塊1221主要用于處理執(zhí)行時(shí)間較長(zhǎng)的內(nèi)存管控措施以及亮滅屏識(shí)別,省電精靈模塊1222主要用于識(shí)別應(yīng)用的運(yùn)行狀態(tài),并判斷應(yīng)用所消耗的電量是否超過(guò)電量閾值,以進(jìn)行管控處理(如關(guān)閉進(jìn)程、限制應(yīng)用啟動(dòng),延遲分發(fā)消息等),內(nèi)存管控模塊1223主要用于外部模塊接口管理及處理、系統(tǒng)空閑狀態(tài)/負(fù)載狀態(tài)識(shí)別,空閑內(nèi)存閾值配置管理、內(nèi)存壓力狀態(tài)識(shí)別、精細(xì)化內(nèi)存回收策略制定、智能內(nèi)存分配以及維測(cè)管理。
核心庫(kù)層130主要為框架層120的各個(gè)組件提供其基本實(shí)現(xiàn)的一組c/c++庫(kù)(應(yīng)用框架的底層庫(kù)),其中,核心庫(kù)層130包括感知守護(hù)進(jìn)程131,感知守護(hù)進(jìn)程131主要用于采集系統(tǒng)資源狀態(tài)信息。
內(nèi)核層140位于android操作系統(tǒng)的最底層,可以看做為硬件層與系統(tǒng)中其他軟件組直接的抽象,主要為android操作系統(tǒng)提供核心的系統(tǒng)服務(wù),包括安全機(jī)制、內(nèi)存管理、進(jìn)程管理、文件管理、網(wǎng)絡(luò)通訊管理以及驅(qū)動(dòng)管理,此外,本發(fā)明實(shí)施例中,內(nèi)核層140還可以用于單個(gè)進(jìn)程級(jí)的緩存回收。
請(qǐng)參見圖2,圖2是本發(fā)明實(shí)施例公開的一種內(nèi)存回收方法的流程示意圖。其中,該方法可以應(yīng)用于圖1所示的內(nèi)存管控模塊1223,具體的,內(nèi)存管控模塊1223可以是一個(gè)或多個(gè)線程,或者,內(nèi)存管控模塊1223可以是一個(gè)或多個(gè)進(jìn)程。如圖2所示,該方法可以包括以下步驟。
201、在檢測(cè)到第一關(guān)鍵事件時(shí),確定系統(tǒng)當(dāng)前的可用內(nèi)存小于內(nèi)存閾值。
本發(fā)明實(shí)施例中,內(nèi)存管控模塊1223可以檢測(cè)應(yīng)用程序的關(guān)鍵事件,具體的,可以在活動(dòng)管理器服務(wù)(activitymanagerservice,ams)啟動(dòng)每個(gè)應(yīng)用的活動(dòng)(activity)的時(shí)候,通過(guò)鉤子(hook)函數(shù)獲取應(yīng)用程序的關(guān)鍵信息(如進(jìn)程名稱、用戶身份標(biāo)識(shí)(useridentifier,uid)以及進(jìn)程身份標(biāo)識(shí)(processidentifier,pid),進(jìn)一步地,ams可以將獲取到的應(yīng)用程序的關(guān)鍵信息發(fā)送給內(nèi)存管控模塊1223,這樣,內(nèi)存管控模塊1223就可以檢測(cè)到應(yīng)用程序的關(guān)鍵事件。
其中,該應(yīng)用程序的關(guān)鍵事件可以包括但不限于程序啟動(dòng)開始事件、清理事件、內(nèi)存不足(outofmenory,oom)事件,程序啟動(dòng)完成事件、亮屏事件、滅屏事件、觸屏事件、界面切換事件、任務(wù)切換完成事件、廣播事件、網(wǎng)絡(luò)連接/掃描/狀態(tài)變化事件(如wifi、2/3/4g、藍(lán)牙、紅外、全球定位系統(tǒng)(globalpositioningsystem,gps)、電臺(tái)廣播、近場(chǎng)通信(nearfieldcommunication,nfc))、外設(shè)連接變化事件(如插拔充電器等)、通知鬧鈴類事件、電話類事件(來(lái)電、信號(hào)變化等)、媒體類事件(音視頻變化、錄音播放)、閃光燈相關(guān)類事件、程序安裝卸載類事件、電池電量類事件等。
本發(fā)明實(shí)施例中,可以預(yù)先將需要立即進(jìn)行內(nèi)存回收的事件定義為第一關(guān)鍵事件,該第一關(guān)鍵事件可以包括但不限于程序啟動(dòng)開始事件、清理事件以及oom事件。其中,程序啟動(dòng)開始事件主要指由用戶觸發(fā)的需要立即啟動(dòng)的應(yīng)用程序事件(如用戶點(diǎn)擊微信應(yīng)用),清理事件可以包括但不限于終端管家清理事件、一鍵清理事件、應(yīng)用卸載事件以及應(yīng)用緩存清空事件。oom事件可以包括但不限于大內(nèi)存應(yīng)用啟動(dòng)需求內(nèi)存超過(guò)內(nèi)存閾值事件、系統(tǒng)oom事件以及應(yīng)用強(qiáng)制停止事件。
本發(fā)明實(shí)施例中,系統(tǒng)的內(nèi)存可以包括:被占用內(nèi)存以及可用內(nèi)存,其中,被占用內(nèi)存主要指當(dāng)前正在運(yùn)行的進(jìn)程和服務(wù)所占用的內(nèi)存以及內(nèi)核運(yùn)行所占用的內(nèi)存,可用內(nèi)存指系統(tǒng)的空閑內(nèi)存和緩存。
在檢測(cè)到第一關(guān)鍵事件時(shí)可以獲取系統(tǒng)當(dāng)前的可用內(nèi)存,并判斷系統(tǒng)當(dāng)前的可用內(nèi)存是否小于內(nèi)存閾值,當(dāng)確定系統(tǒng)當(dāng)前的可用內(nèi)存小于內(nèi)存閾值時(shí),表明當(dāng)前系統(tǒng)存在內(nèi)存壓力,需要進(jìn)行內(nèi)存回收。其中,該內(nèi)存閾值為與第一關(guān)鍵事件對(duì)應(yīng)的第一內(nèi)存閾值。
可選的,該內(nèi)存閾值可以是靜態(tài)預(yù)置的。具體的,有如下幾種情況:
(1)根據(jù)產(chǎn)品規(guī)格配置內(nèi)存閾值
針對(duì)2g/3g/4g/6g隨機(jī)存取存儲(chǔ)器(randomaccessmemory,ram)的產(chǎn)品,系統(tǒng)的可用內(nèi)存不同,相應(yīng)的,內(nèi)存閾值也不同。比如:針對(duì)3gram的產(chǎn)品,可以配置內(nèi)存閾值為600mb,針對(duì)4gram的產(chǎn)品,可以配置內(nèi)存閾值為700mb。
(2)根據(jù)應(yīng)用場(chǎng)景配置盡可能小的內(nèi)存閾值
不同的應(yīng)用及其不同的場(chǎng)景,對(duì)于內(nèi)存的耗費(fèi)是不同的。因此要想配置合理的內(nèi)存閾值,采用方式(1)存在一些弊端,可能會(huì)因?yàn)闆](méi)有考慮某個(gè)第三方應(yīng)用而出現(xiàn)該應(yīng)用啟動(dòng)時(shí)卡頓的現(xiàn)象。針對(duì)此類問(wèn)題,可以通過(guò)離線分析應(yīng)用市場(chǎng)中排名靠前的第三方應(yīng)用,獲取各類應(yīng)用在各個(gè)場(chǎng)景中最大的內(nèi)存占用信息。
請(qǐng)參見表1,表1為第三方應(yīng)用在典型場(chǎng)景下最大的內(nèi)存占用信息。需要說(shuō)明的是,表1只是示例性地列舉了幾個(gè)應(yīng)用。
表1
具體的,可以在終端開機(jī)完成,接收到啟動(dòng)完成(boot_completed)事件時(shí),查詢所有在終端上已安裝的應(yīng)用的標(biāo)識(shí)(如應(yīng)用名稱),進(jìn)一步地,根據(jù)應(yīng)用的標(biāo)識(shí)從表1中獲取需要的信息(如進(jìn)程名稱、運(yùn)行場(chǎng)景、最大內(nèi)存占用信息),以生成本地程序內(nèi)存占用表,可以使用可擴(kuò)展標(biāo)記語(yǔ)言(extensiblemarkuplanguage,xml)文件或者txt文件來(lái)保存本地程序內(nèi)存占用表。終端可以針對(duì)不同的應(yīng)用,分別從本地程序內(nèi)存占用表中查詢?cè)搼?yīng)用的最大內(nèi)存占用信息,并設(shè)置內(nèi)存閾值為該應(yīng)用的最大占用內(nèi)存。
(3)根據(jù)系統(tǒng)運(yùn)行進(jìn)程歷史占用內(nèi)存進(jìn)行配置
由于每個(gè)用戶都有自己的特點(diǎn),終端被長(zhǎng)時(shí)間使用后,終端上安裝和運(yùn)行的應(yīng)用并不一致,可以根據(jù)系統(tǒng)運(yùn)行進(jìn)程歷史占用內(nèi)存來(lái)配置內(nèi)存閾值。具體的,可以在用戶不使用終端的時(shí)候(比如半夜)查詢每個(gè)進(jìn)程運(yùn)行時(shí)內(nèi)存占用的歷史狀態(tài)信息(procstats),獲取其中最大的內(nèi)存占用信息(如應(yīng)用程序名稱、最大占用內(nèi)存),進(jìn)一步地,將最大占用內(nèi)存和當(dāng)前系統(tǒng)的內(nèi)存閾值比較,若最大占用內(nèi)存大于當(dāng)前系統(tǒng)的內(nèi)存閾值,則選取該最大占用內(nèi)存作為系統(tǒng)新的內(nèi)存閾值。
(4)通過(guò)云端下發(fā)配置內(nèi)存閾值
云端服務(wù)器可以根據(jù)終端的標(biāo)識(shí)收集在終端上運(yùn)行的所有應(yīng)用在各個(gè)場(chǎng)景占用的內(nèi)存信息,將占用內(nèi)存大于預(yù)設(shè)值(如300mb)的應(yīng)用名及該應(yīng)用當(dāng)時(shí)的運(yùn)行場(chǎng)景等信息形成一張表單,定期(如每月)將該表單推送給終端;終端接收到表單后,將此表單中的應(yīng)用信息和本地應(yīng)用列表進(jìn)行遍歷,并確定終端上安裝的應(yīng)用的最大內(nèi)存占用信息,進(jìn)一步地,將最大占用內(nèi)存和當(dāng)前系統(tǒng)的內(nèi)存閾值進(jìn)行比較,若最大占用內(nèi)存大于當(dāng)前系統(tǒng)的內(nèi)存閾值,則選取該最大占用內(nèi)存作為系統(tǒng)新的內(nèi)存閾值。
可選的,該內(nèi)存閾值可以是動(dòng)態(tài)配置的。
具體的,可以通過(guò)用戶行為分析算法,根據(jù)用戶使用習(xí)慣、應(yīng)用使用歷史、使用頻率、使用時(shí)長(zhǎng)等信息,根據(jù)預(yù)測(cè)算法,預(yù)測(cè)出接下來(lái)最有可能運(yùn)行的應(yīng)用,并形成應(yīng)用列表;獲取應(yīng)用列表中的應(yīng)用需要使用的最大內(nèi)存,并將最大內(nèi)存和當(dāng)前系統(tǒng)的內(nèi)存閾值相比,若最大內(nèi)存大于當(dāng)前系統(tǒng)的內(nèi)存閾值,則選取該最大內(nèi)存作為系統(tǒng)新的內(nèi)存閾值。
202、在確定系統(tǒng)當(dāng)前的可用內(nèi)存小于內(nèi)存閾值時(shí)創(chuàng)建后臺(tái)進(jìn)程列表。
其中,在確定系統(tǒng)當(dāng)前存在內(nèi)存壓力時(shí)需要立即創(chuàng)建后臺(tái)進(jìn)程列表,該后臺(tái)進(jìn)程列表為一個(gè)根據(jù)應(yīng)用的重要程度以及進(jìn)程優(yōu)先級(jí)進(jìn)行排序的動(dòng)態(tài)二維表,包括一個(gè)或多個(gè)應(yīng)用的進(jìn)程,即后臺(tái)進(jìn)程列表可以包括一個(gè)或多個(gè)應(yīng)用,同時(shí),一個(gè)應(yīng)用可以包括一個(gè)或多個(gè)進(jìn)程。該后臺(tái)進(jìn)程列表為根據(jù)應(yīng)用的重要程度以及進(jìn)程優(yōu)先級(jí)排序后的列表。
具體的,創(chuàng)建后臺(tái)進(jìn)程列表的方式具體包括以下步驟:
11)確定當(dāng)前在后臺(tái)運(yùn)行的每個(gè)應(yīng)用的關(guān)鍵因素的分值,所述關(guān)鍵因素包括以下中的一個(gè)或多個(gè):進(jìn)程優(yōu)先級(jí)、用戶使用習(xí)慣、進(jìn)程占用系統(tǒng)資源以及應(yīng)用的關(guān)聯(lián)關(guān)系;
12)針對(duì)每個(gè)所述應(yīng)用,將所有所述關(guān)鍵因素的分值進(jìn)行加權(quán)計(jì)算,獲得所述應(yīng)用的重要程度;
13)根據(jù)所有所述應(yīng)用的重要程度,對(duì)所有所述應(yīng)用進(jìn)行排序;
14)根據(jù)進(jìn)程優(yōu)先級(jí),對(duì)排序后的每個(gè)所述應(yīng)用包括的進(jìn)程進(jìn)行排序,以生成后臺(tái)進(jìn)程列表。
在該實(shí)施例中,在終端后臺(tái)運(yùn)行的每個(gè)應(yīng)用可以包括一個(gè)或多個(gè)進(jìn)程,每個(gè)應(yīng)用的關(guān)鍵因素包括以下種的一個(gè)或多個(gè):進(jìn)程優(yōu)先級(jí)、用戶使用習(xí)慣、進(jìn)程占用系統(tǒng)資源以及應(yīng)用的關(guān)聯(lián)關(guān)系。每個(gè)關(guān)鍵因素都有相應(yīng)的分值?;趹?yīng)用的關(guān)鍵因素(進(jìn)程優(yōu)先級(jí)、用戶使用習(xí)慣、進(jìn)程占用系統(tǒng)資源以及應(yīng)用的關(guān)聯(lián)關(guān)系)來(lái)創(chuàng)建后臺(tái)進(jìn)程列表,后續(xù)就可以根據(jù)內(nèi)存的需求從該后臺(tái)進(jìn)程列表中確定需要處理的進(jìn)程,這樣就可以精確地選擇可殺進(jìn)程隊(duì)列,減少錯(cuò)殺/多殺/少殺進(jìn)程的概率。
其中,系統(tǒng)會(huì)對(duì)每個(gè)進(jìn)程的重要性進(jìn)行評(píng)估,進(jìn)程的重要性也代表了進(jìn)程優(yōu)先級(jí)。通常,將重要性以oom_adj(outofmemoryadjust)這個(gè)數(shù)值表示出來(lái),賦予各個(gè)進(jìn)程,系統(tǒng)會(huì)根據(jù)oom_adj來(lái)判斷需要結(jié)束哪些進(jìn)程。一般,oom_adj的分值由系統(tǒng)提供,系統(tǒng)可以根據(jù)應(yīng)用當(dāng)前的運(yùn)行狀態(tài)來(lái)分配,oom_adj的分值范圍如下:-17<oom_adj<16。oom_adj的分值越大,該進(jìn)程被系統(tǒng)選中終止的可能就越高,進(jìn)程優(yōu)先級(jí)就越低。
其中,用戶使用習(xí)慣可以包括但不限于應(yīng)用的使用時(shí)間記錄、應(yīng)用的累計(jì)使用次數(shù)、每次被使用的時(shí)長(zhǎng)以及累計(jì)使用時(shí)長(zhǎng)。根據(jù)用戶使用習(xí)慣可以確定哪些進(jìn)程為用戶經(jīng)常使用的應(yīng)用的進(jìn)程,或者確定哪些進(jìn)程為用戶使用時(shí)間較長(zhǎng)的應(yīng)用的進(jìn)程,或者確定哪些進(jìn)程為用戶最近使用的應(yīng)用的進(jìn)程等等相關(guān)進(jìn)程的信息。其中,可以通過(guò)rms模塊1221來(lái)進(jìn)行app使用習(xí)慣的學(xué)習(xí),此外,可以綜合考慮三類算法來(lái)識(shí)別app的重要程度。
請(qǐng)一并參見圖2a,圖2a是本發(fā)明實(shí)施例公開的一種app重要程度識(shí)別的示意圖。如圖2a所示,虛線框1代表的是基于機(jī)器學(xué)習(xí)的app重要程度識(shí)別模型;虛線框2代表的是基于統(tǒng)計(jì)規(guī)則的app重要程度識(shí)別模型,第三類算法是基于最近使用的應(yīng)用(latestrecentused,lru)來(lái)識(shí)別。針對(duì)應(yīng)用a來(lái)說(shuō),假設(shè)基于機(jī)器學(xué)習(xí)的app重要程度為ph(a),基于統(tǒng)計(jì)規(guī)則的app重要程度識(shí)別為pl(a),基于最近使用的應(yīng)用識(shí)別為pu(a),對(duì)應(yīng)的權(quán)重分別為wh、wl、wu,則最后應(yīng)用a的重要程度計(jì)算公式為
p(a)=wh*ph(a)+wl*pl(a)+wu*pu(a)
其中,各權(quán)重值需要在訓(xùn)練中不斷學(xué)習(xí)得到,與用戶無(wú)關(guān),預(yù)置到app重要程度識(shí)別插件中,通過(guò)版本迭代更新。
可以根據(jù)應(yīng)用的重要程度來(lái)分配用戶使用習(xí)慣(habit)的分值,habit的分值范圍如下:0<habit<16。habit的分值越低,表明用戶使用應(yīng)用越頻繁。
其中,進(jìn)程占用系統(tǒng)資源可以包括但不限于計(jì)算資源,存儲(chǔ)資源,中央處理器(centralprocessingunit,cpu)資源以及輸入輸出(inputoutput,io)資源??梢愿鶕?jù)資源占用大小來(lái)設(shè)定進(jìn)程占用系統(tǒng)資源(resource)的分值,resource的分值范圍如下:0<resource<16,比如,進(jìn)程占用cpu>3%,則resource=16。通常,進(jìn)程占用的系統(tǒng)資源越多,該進(jìn)程就越容易被選中回收該進(jìn)程對(duì)應(yīng)的內(nèi)存。
應(yīng)用的關(guān)聯(lián)關(guān)系是指應(yīng)用之間存在的關(guān)聯(lián)關(guān)系,具體的,兩個(gè)應(yīng)用之間可以通過(guò)進(jìn)程關(guān)聯(lián)起來(lái)。本發(fā)明實(shí)施例中可以是后臺(tái)應(yīng)用與前臺(tái)應(yīng)用的關(guān)聯(lián)關(guān)系,該關(guān)聯(lián)關(guān)系是一個(gè)瞬態(tài),可以根據(jù)當(dāng)前進(jìn)程狀態(tài)實(shí)時(shí)更新。其中,關(guān)聯(lián)關(guān)系包括但不限于getcontentprovider、startactivity、bindservice、unbindservice、startservice、stopservice以及widget。
請(qǐng)一并參見圖2b,圖2b是本發(fā)明實(shí)施例公開的一種應(yīng)用的關(guān)聯(lián)關(guān)系的示意圖。其中,pid1、pid2、pid3、pid4……代表進(jìn)程的身份標(biāo)識(shí),圖2b中最左邊的進(jìn)程表示被最右邊的進(jìn)程所依賴,兩個(gè)進(jìn)程存在關(guān)聯(lián)關(guān)系,例如:pid1進(jìn)程的service1被pid2進(jìn)程通過(guò)bindservice關(guān)聯(lián),pid2進(jìn)程的service1被pid3進(jìn)程通過(guò)startservice關(guān)聯(lián)。
一般在進(jìn)行后臺(tái)進(jìn)程清理的時(shí)候,被清理的進(jìn)程可能會(huì)被其關(guān)聯(lián)的進(jìn)程拉起來(lái),或者由于清理了某個(gè)進(jìn)程會(huì)導(dǎo)致功能異常。舉例來(lái)說(shuō),前臺(tái)輸入法需要使用后臺(tái)的provider獨(dú)立進(jìn)程,如果把該后臺(tái)的provider獨(dú)立進(jìn)程凍結(jié)或清理,會(huì)導(dǎo)致前臺(tái)輸入法異常;如果后臺(tái)應(yīng)用在播放音樂(lè),而音樂(lè)又依賴后臺(tái)的service獨(dú)立進(jìn)程,如果把該service獨(dú)立進(jìn)程凍結(jié)或清理,會(huì)導(dǎo)致音樂(lè)播放應(yīng)用異常。其中,用戶可以設(shè)定應(yīng)用的關(guān)聯(lián)關(guān)系(application-relation)的分值,以進(jìn)行后續(xù)的加權(quán)操作。application-relation的分值的范圍如下:0<application-relation<16,如果應(yīng)用之間是直接關(guān)聯(lián),application-relation的分值可以為0,如果應(yīng)用之間是間接關(guān)聯(lián),application-relation的分值可以為16。application-relation的分值越高,表明該應(yīng)用與其他應(yīng)用的關(guān)聯(lián)性就越弱。
進(jìn)一步地,針對(duì)每個(gè)應(yīng)用,可以將所有關(guān)鍵因素的分值進(jìn)行加權(quán)計(jì)算,獲得應(yīng)用的重要程度。具體的,算法如下:
score=oom_adj*poom_adj+habit*phabit+resource*presource+application-relation*papplication-relation,其中,poom_adj+phabit+presource+papplication-relation=1。
score得分可以用來(lái)衡量應(yīng)用的重要程度,score得分越小,應(yīng)用的重要程度越高。比如:應(yīng)用1的score得分高于應(yīng)用2的score得分,則可以確定應(yīng)用2的重要程度高于應(yīng)用1。
更進(jìn)一步地,根據(jù)score得分的高低可以對(duì)應(yīng)用進(jìn)行排序,針對(duì)每個(gè)應(yīng)用,在應(yīng)用包括至少兩個(gè)進(jìn)程的情況下,可以根據(jù)進(jìn)程優(yōu)先級(jí),對(duì)該應(yīng)用包括的進(jìn)程進(jìn)行排序,這樣就可以生成后臺(tái)進(jìn)程列表,該后臺(tái)進(jìn)程列表實(shí)質(zhì)上是一個(gè)包括應(yīng)用以及應(yīng)用的進(jìn)程的二維表,該二維表中應(yīng)用按照重要程度從高到底或者從低到高進(jìn)行排序,應(yīng)用的進(jìn)程按照進(jìn)程優(yōu)先級(jí)從高到底或者從低到高進(jìn)行排序。
請(qǐng)參見表2,表2是本發(fā)明實(shí)施例公開的一種應(yīng)用-進(jìn)程列表。
表2
其中,系統(tǒng)內(nèi)運(yùn)行的應(yīng)用可以分為18大類;主要包括:關(guān)鍵系統(tǒng)服務(wù)、關(guān)鍵常駐應(yīng)用、前臺(tái)應(yīng)用、systemserver、前臺(tái)所依賴的后臺(tái)、普通系統(tǒng)服務(wù)、普通常駐應(yīng)用、home在后臺(tái)、用戶可感知到的后臺(tái)應(yīng)用、visible應(yīng)用、手機(jī)管家保護(hù)的后臺(tái)、上一次在前臺(tái)的應(yīng)用、和前臺(tái)弱關(guān)聯(lián)的后臺(tái)、用戶對(duì)應(yīng)用使用習(xí)慣、應(yīng)用預(yù)置重要程度、應(yīng)用oom_adj大于2、系統(tǒng)識(shí)別為有害應(yīng)用、人為識(shí)別有害應(yīng)用(黑名單)。
作為一種可選的實(shí)施方式,上述后臺(tái)進(jìn)程列表可以為一張表(如上表2),或者,上述后臺(tái)進(jìn)程列表可以包括3張子表(比如將上述表2分割成3部分,形成3張子表),分別為不可回收列表、重要進(jìn)程列表以及可殺列表。其中,不可回收列表主要是系統(tǒng)進(jìn)程和服務(wù),如果缺少這些進(jìn)程,將會(huì)影響整個(gè)應(yīng)用的運(yùn)行,比如關(guān)鍵系統(tǒng)服務(wù)、關(guān)鍵常駐應(yīng)用、前臺(tái)應(yīng)用、systemserver、前臺(tái)所依賴的后臺(tái)等相關(guān)類應(yīng)用,重要進(jìn)程列表主要是設(shè)備閾值應(yīng)用、用戶感知類應(yīng)用以及用戶常用的重要應(yīng)用,比如普通系統(tǒng)服務(wù)、普通常駐應(yīng)用、home在后臺(tái)、用戶可感知到的后臺(tái)應(yīng)用、visible應(yīng)用、手機(jī)管家保護(hù)的后臺(tái)、上一次在前臺(tái)的應(yīng)用、和前臺(tái)弱關(guān)聯(lián)的后臺(tái)等相關(guān)類應(yīng)用,可殺列表主要包括用戶對(duì)應(yīng)用使用習(xí)慣、應(yīng)用預(yù)置重要程度、應(yīng)用oom_adj大于2、系統(tǒng)識(shí)別為有害應(yīng)用、人為識(shí)別有害應(yīng)用等相關(guān)類應(yīng)用。
203、從后臺(tái)進(jìn)程列表中確定待回收內(nèi)存的進(jìn)程。
在后臺(tái)進(jìn)程列表包括3張子表的情況下,內(nèi)存回收列表處理順序?yàn)椋涸谶M(jìn)行內(nèi)存回收時(shí),優(yōu)先回收可殺列表,回收方式從可殺列表末尾從下往上進(jìn)行回收;當(dāng)可殺列表為空,同時(shí)系統(tǒng)內(nèi)存還存在壓力,則開始回收重要進(jìn)程列表,回收方式還是從重要進(jìn)程列表末尾從下往上進(jìn)行回收?;谏鲜鲈瓌t,可以優(yōu)先從可殺列表中確定待回收內(nèi)存的進(jìn)程,其次是從重要進(jìn)程列表中確定待回收內(nèi)存的進(jìn)程。
可選的,上述列表的分類也可以是變化,比如:對(duì)于重要進(jìn)程列表中重要性不夠高的應(yīng)用,可以將該應(yīng)用降低列入到可殺列表中。
其中,后臺(tái)進(jìn)程列表包括多個(gè)應(yīng)用的進(jìn)程,待回收內(nèi)存的進(jìn)程為多個(gè)應(yīng)用的進(jìn)程中滿足進(jìn)程所占用內(nèi)存與內(nèi)存壓力值的差值的絕對(duì)值小于預(yù)設(shè)閾值的條件的進(jìn)程,內(nèi)存壓力值為內(nèi)存閾值與系統(tǒng)當(dāng)前的可用內(nèi)存的差值。也就是說(shuō),待回收內(nèi)存的進(jìn)程所占用內(nèi)存可以大于內(nèi)存壓力值,也可以小于內(nèi)存壓力值,待回收內(nèi)存的進(jìn)程所占用內(nèi)存與內(nèi)存壓力值的差值的絕對(duì)值在一定范圍之內(nèi),即絕對(duì)值小于預(yù)設(shè)閾值,該預(yù)設(shè)閾值可以是用戶設(shè)定的,也可以是系統(tǒng)默認(rèn)的,本發(fā)明實(shí)施例不做限定。
其中,預(yù)先設(shè)定了內(nèi)存壓力等級(jí):高級(jí)、中級(jí)以及低級(jí),高級(jí)表征內(nèi)存壓力較大,中級(jí)表征內(nèi)存壓力適中,低級(jí)表征內(nèi)存壓力較小。以及預(yù)先設(shè)定了內(nèi)存壓力值所屬的范圍:第一范圍、第二范圍以及第三范圍,其中,第一范圍小于第二范圍,第二范圍小于第三范圍??梢愿鶕?jù)內(nèi)存壓力值所屬的范圍來(lái)確定系統(tǒng)當(dāng)前的內(nèi)存壓力等級(jí)。比如:當(dāng)內(nèi)存壓力值屬于第一范圍時(shí),可以確定系統(tǒng)當(dāng)前的內(nèi)存壓力等級(jí)為低級(jí),當(dāng)內(nèi)存壓力值屬于第二范圍時(shí),可以確定系統(tǒng)當(dāng)前的內(nèi)存壓力等級(jí)為中級(jí),當(dāng)內(nèi)存壓力值屬于第三范圍時(shí),可以確定系統(tǒng)當(dāng)前的內(nèi)存壓力等級(jí)為高級(jí)。
在確定系統(tǒng)當(dāng)前的內(nèi)存壓力等級(jí)為高級(jí)的情況下,需要采取對(duì)待回收內(nèi)存的進(jìn)程進(jìn)行清理的策略。這種策略是將終端中已存在的進(jìn)程所占用的資源進(jìn)行銷毀回收,使得系統(tǒng)的可用內(nèi)存增加。
在確定系統(tǒng)當(dāng)前的內(nèi)存壓力等級(jí)為中級(jí)的情況下,需要采取對(duì)待回收內(nèi)存的進(jìn)程進(jìn)行系統(tǒng)級(jí)或應(yīng)用級(jí)的內(nèi)存回收的策略,系統(tǒng)級(jí)的內(nèi)存回收的策略可以將系統(tǒng)的緩存根據(jù)其重要程度進(jìn)行回收,達(dá)到增大空閑內(nèi)存的目的。其中,一個(gè)應(yīng)用可能有一個(gè)或多個(gè)進(jìn)程,因此,可以采取針對(duì)應(yīng)用級(jí)的內(nèi)存回收的策略,比如:kill、compress、dropcache等策略。
在確定系統(tǒng)當(dāng)前的內(nèi)存壓力等級(jí)為低級(jí)的情況下,需要根據(jù)應(yīng)用的重要程度采取對(duì)待回收內(nèi)存的進(jìn)程進(jìn)行單個(gè)進(jìn)程級(jí)壓縮或者單個(gè)進(jìn)程級(jí)緩存回收的策略。如果應(yīng)用的重要程度較高,可以采取對(duì)待回收內(nèi)存的進(jìn)程進(jìn)行單個(gè)進(jìn)程級(jí)壓縮,如果應(yīng)用的重要程度較低,可以采取對(duì)待回收內(nèi)存的進(jìn)程進(jìn)行單個(gè)進(jìn)程級(jí)緩存回收。其中,對(duì)待回收內(nèi)存的進(jìn)程進(jìn)行單個(gè)進(jìn)程級(jí)壓縮是將終端中運(yùn)行進(jìn)程占用的內(nèi)存資源通過(guò)交換分區(qū)進(jìn)行壓縮處理,從而達(dá)到減小占用系統(tǒng)物理內(nèi)存的目的。對(duì)待回收內(nèi)存的進(jìn)程進(jìn)行單個(gè)進(jìn)程級(jí)緩存回收是提前將終端中緩存占用的內(nèi)存空間釋放,減少緩存所占用的內(nèi)存,從而增加空閑內(nèi)存,這樣就可以提高內(nèi)存分配的效率。
本發(fā)明實(shí)施例中,根據(jù)系統(tǒng)當(dāng)前的內(nèi)存壓力,可以從后臺(tái)進(jìn)程列表中確定待回收內(nèi)存的進(jìn)程,這樣就不會(huì)錯(cuò)殺重要進(jìn)程,不會(huì)多殺或少殺進(jìn)程。
204、向系統(tǒng)內(nèi)核發(fā)送處理指令,以觸發(fā)系統(tǒng)內(nèi)核對(duì)待回收內(nèi)存的進(jìn)程進(jìn)行處理以回收待回收內(nèi)存的進(jìn)程所占用的內(nèi)存。
本發(fā)明實(shí)施例中,不同的內(nèi)存壓力等級(jí)可以采取不同的內(nèi)存回收策略,每種內(nèi)存回收策略對(duì)應(yīng)一個(gè)接口??梢酝ㄟ^(guò)與內(nèi)存回收策略對(duì)應(yīng)的接口向系統(tǒng)內(nèi)核發(fā)送處理指令,系統(tǒng)內(nèi)核接收到處理指令之后,就可以采取相應(yīng)的內(nèi)存回收策略對(duì)待回收內(nèi)存的進(jìn)程進(jìn)行處理以回收所述待回收內(nèi)存的進(jìn)程對(duì)應(yīng)的內(nèi)存。
其中,可以以kill_sig信號(hào)的方式向系統(tǒng)內(nèi)核發(fā)送處理指令,通常,一個(gè)處理指令可以攜帶一個(gè)待回收內(nèi)存的進(jìn)程的標(biāo)識(shí)。
其中,確定出的待回收的進(jìn)程可以為一個(gè)也可以為多個(gè),在一個(gè)進(jìn)程需要發(fā)送多個(gè)處理指令的情況下,該進(jìn)程可以一個(gè)一個(gè)連續(xù)地發(fā)送處理指令,而不需要在發(fā)送完一個(gè)處理指令后去檢測(cè)系統(tǒng)內(nèi)核回收進(jìn)程對(duì)應(yīng)的內(nèi)存的狀態(tài),然后再去發(fā)送另一個(gè)處理指令。
作為一種可選的實(shí)施方式,在確定出的待回收的進(jìn)程為多個(gè)的情況下,向系統(tǒng)內(nèi)核發(fā)送處理指令包括:
調(diào)用多個(gè)線程向系統(tǒng)內(nèi)核發(fā)送多個(gè)處理指令,其中,每個(gè)所述線程用于發(fā)送一個(gè)或多個(gè)處理指令。
在該可選的實(shí)施例中,在確定出的待回收的進(jìn)程為多個(gè)的情況下,可以調(diào)用多個(gè)線程向系統(tǒng)內(nèi)核發(fā)送多個(gè)處理指令,具體的,一個(gè)線程發(fā)送多個(gè)處理指令的實(shí)現(xiàn)方式為:該線程一個(gè)一個(gè)連續(xù)地發(fā)送處理指令,而不需要在發(fā)送完一個(gè)處理指令后去檢測(cè)系統(tǒng)內(nèi)核回收進(jìn)程對(duì)應(yīng)的內(nèi)存的狀態(tài),然后再去發(fā)送另一個(gè)處理指令。系統(tǒng)對(duì)該待回收內(nèi)存的進(jìn)程所占用的內(nèi)存進(jìn)行回收后,可以緩解系統(tǒng)當(dāng)前的內(nèi)存壓力。
可見,這種方式中,不需要等待系統(tǒng)內(nèi)核真正完成進(jìn)程對(duì)應(yīng)的內(nèi)存的回收操作,直接采取異步回收待回收內(nèi)存的進(jìn)程對(duì)應(yīng)的內(nèi)存的機(jī)制,加速后臺(tái)進(jìn)程的回收性能,從而提高內(nèi)存回收的效率。
請(qǐng)一并參見圖2c以及圖2d,圖2c是本發(fā)明實(shí)施例公開的一種相機(jī)啟動(dòng)時(shí)序圖,圖2d是本發(fā)明實(shí)施例公開的另一種相機(jī)啟動(dòng)時(shí)序圖。其中,圖2c中,相機(jī)應(yīng)用程序在系統(tǒng)可用內(nèi)存只有619mb時(shí),在啟動(dòng)開始時(shí)不進(jìn)行內(nèi)存回收,等到系統(tǒng)的內(nèi)存低于系統(tǒng)水線后,通過(guò)(lowmemorykiller,lmk)機(jī)制回收內(nèi)存,從圖2c可以看出,整個(gè)相機(jī)在內(nèi)存只有619mb的時(shí)候啟動(dòng),到出現(xiàn)相機(jī)的拍照按鈕截止,總計(jì)花費(fèi)了3.255s。其中,圖2d中,相機(jī)應(yīng)用程序在系統(tǒng)可用內(nèi)存只有604mb時(shí),采用本發(fā)明實(shí)施例中的方案,在啟動(dòng)時(shí)采取相應(yīng)的策略進(jìn)行內(nèi)存回收,從圖2d可以看出,整個(gè)相機(jī)在內(nèi)存只有604mb的時(shí)候啟動(dòng),到出現(xiàn)相機(jī)的拍照按鈕截止,總計(jì)花費(fèi)了1.85s??梢?,從圖2c以及圖2d的對(duì)比可以看出,在同樣的測(cè)試環(huán)境,可用內(nèi)存相差不大的條件下,本發(fā)明方案相較于傳統(tǒng)的lmk方案,相機(jī)啟動(dòng)性能得到明顯改善。
可見,在圖2所描述的方法流程中,在檢測(cè)到第一關(guān)鍵事件并確定系統(tǒng)當(dāng)前的可用內(nèi)存小于內(nèi)存閾值時(shí),可以主動(dòng)進(jìn)行內(nèi)存回收,當(dāng)應(yīng)用程序真正需要大量?jī)?nèi)存的時(shí)候,系統(tǒng)內(nèi)核已經(jīng)回收回來(lái)大量可用的內(nèi)存,從而可以減少終端出現(xiàn)卡頓現(xiàn)象的概率。
請(qǐng)參見圖3,圖3是本發(fā)明實(shí)施例公開的另一種內(nèi)存回收方法的流程示意圖。其中,該方法可以應(yīng)用于圖1所示的內(nèi)存管控模塊1223,具體的,內(nèi)存管控模塊1223可以是一個(gè)或多個(gè)線程,或者,內(nèi)存管控模塊1223可以是一個(gè)或多個(gè)進(jìn)程。如圖3所示,該方法可以包括以下步驟。
301、在檢測(cè)到第二關(guān)鍵事件且確定系統(tǒng)處于空閑狀態(tài)時(shí),確定當(dāng)前系統(tǒng)的可用內(nèi)存小于內(nèi)存閾值。
本發(fā)明實(shí)施例中,內(nèi)存管控模塊1223可以檢測(cè)應(yīng)用程序的關(guān)鍵事件,具體的,可以在活動(dòng)管理器服務(wù)(activitymanagerservice,ams)啟動(dòng)每個(gè)應(yīng)用的活動(dòng)(activity)的時(shí)候,通過(guò)鉤子(hook)函數(shù)獲取應(yīng)用程序的關(guān)鍵信息(如進(jìn)程名稱、用戶身份標(biāo)識(shí)(useridentifier,uid)以及進(jìn)程身份標(biāo)識(shí)(processidentifier,pid),進(jìn)一步地,ams可以將獲取到的應(yīng)用程序的關(guān)鍵信息發(fā)送給內(nèi)存管控模塊1223,這樣,內(nèi)存管控模塊1223就可以檢測(cè)應(yīng)用程序的關(guān)鍵事件。
其中,該應(yīng)用程序的關(guān)鍵事件可以包括但不限于程序啟動(dòng)開始事件、清理事件、內(nèi)存不足(outofmenory,oom)事件,程序啟動(dòng)完成事件、亮屏事件、滅屏事件、觸屏事件、界面切換事件、任務(wù)切換完成事件、廣播事件、網(wǎng)絡(luò)連接/掃描/狀態(tài)變化事件(如wifi、2/3/4g、藍(lán)牙、紅外、gps、電臺(tái)廣播、近場(chǎng)通信(nearfieldcommunication,nfc))、外設(shè)連接變化事件(如插拔充電器等)、通知鬧鈴類事件、電話類事件(來(lái)電、信號(hào)變化等)、媒體類事件(音視頻變化、錄音播放)、閃光燈相關(guān)類事件、程序安裝卸載類事件、電池電量類事件等。
本發(fā)明實(shí)施例中,如果當(dāng)前系統(tǒng)存在人機(jī)交互操作,系統(tǒng)直接進(jìn)行內(nèi)存回收,有可能會(huì)導(dǎo)致用戶的響應(yīng)操作由于cpu得不到及時(shí)響應(yīng)而影響用戶體驗(yàn),這種情況下就不能立即進(jìn)行內(nèi)存回收。
可以預(yù)先將不需要立即進(jìn)行內(nèi)存回收的事件定義為第二關(guān)鍵事件,該第二關(guān)鍵事件可以包括但不限于以下程序啟動(dòng)完成事件、亮屏事件、滅屏事件、觸屏事件、界面切換事件、任務(wù)切換完成事件以及廣播事件。
在檢測(cè)到第二關(guān)鍵事件時(shí),可以先判斷系統(tǒng)是否處于空閑狀態(tài),在確定系統(tǒng)處于空閑狀態(tài)時(shí),再讀取當(dāng)前系統(tǒng)的可用內(nèi)存,以及判斷當(dāng)前系統(tǒng)的可用內(nèi)存是否小于內(nèi)存閾值,在確定當(dāng)前系統(tǒng)的可用內(nèi)存小于內(nèi)存閾值時(shí),表明當(dāng)前系統(tǒng)存在內(nèi)存壓力,需要進(jìn)行內(nèi)存回收。其中,該內(nèi)存閾值為與第二關(guān)鍵事件對(duì)應(yīng)的第一內(nèi)存閾值。其中,系統(tǒng)的空閑狀態(tài)可以包括終端的空閑狀態(tài)和應(yīng)用的空閑狀態(tài)。
可選的,該內(nèi)存閾值可以靜態(tài)預(yù)置的,或者,該內(nèi)存閾值可以動(dòng)態(tài)配置的,具體可以參照?qǐng)D2中所描述的,在此不再贅述。
可選的,可以通過(guò)讀取終端的運(yùn)行狀態(tài)來(lái)確定系統(tǒng)是否處于空閑狀態(tài),或者,可以通過(guò)判斷系統(tǒng)當(dāng)前的負(fù)載情況來(lái)確定系統(tǒng)是否處于空閑狀態(tài)。
系統(tǒng)處于空閑狀態(tài)有2種場(chǎng)景,第一種是在用戶未使用終端的情況下,比如終端處于待機(jī)狀態(tài)可以看作是系統(tǒng)處于空閑狀態(tài),又比如:在應(yīng)用啟動(dòng)完成出現(xiàn)顯示畫面,但以后并沒(méi)有和終端進(jìn)行交互,這個(gè)時(shí)候系統(tǒng)沒(méi)有大量的io操作,可以看作是系統(tǒng)處于空閑狀態(tài),第二種是在用戶使用終端但系統(tǒng)當(dāng)前的負(fù)載不影響用戶體驗(yàn)的情況下,可以看作是系統(tǒng)處于空閑狀態(tài),比如系統(tǒng)的負(fù)載小于負(fù)載閾值。
具體的,確定系統(tǒng)處于空閑狀態(tài)的方式具體可以包括以下步驟:
11)判斷所述系統(tǒng)當(dāng)前的負(fù)載是否小于負(fù)載閾值;
12)在所述系統(tǒng)當(dāng)前的負(fù)載小于所述負(fù)載閾值的情況下,確定系統(tǒng)處于空閑狀態(tài)。
在該實(shí)施例中,可以預(yù)先設(shè)置一個(gè)負(fù)載閾值,該負(fù)載閾值可以是影響用戶體驗(yàn)的系統(tǒng)的負(fù)載的臨界值。如果判斷系統(tǒng)當(dāng)前的負(fù)載小于負(fù)載閾值,表明系統(tǒng)當(dāng)前的負(fù)載不影響用戶體驗(yàn),則可以確定系統(tǒng)處于空閑狀態(tài)。
302、在系統(tǒng)處于空閑狀態(tài)時(shí)創(chuàng)建后臺(tái)進(jìn)程列表。
本發(fā)明實(shí)施例中,需要在系統(tǒng)處于空閑狀態(tài)時(shí)進(jìn)程內(nèi)存回收,而后臺(tái)進(jìn)程列表是一個(gè)動(dòng)態(tài)列表,故同樣需要在系統(tǒng)處于空閑狀態(tài)時(shí)創(chuàng)建后臺(tái)進(jìn)程列表,這樣可以確保后臺(tái)進(jìn)程列表的有效性。
303、從后臺(tái)進(jìn)程列表中確定待回收內(nèi)存的進(jìn)程。
304、向系統(tǒng)內(nèi)核發(fā)送處理指令,以觸發(fā)系統(tǒng)內(nèi)核對(duì)待回收內(nèi)存的進(jìn)程進(jìn)行處理以回收待回收內(nèi)存的進(jìn)程對(duì)應(yīng)的內(nèi)存。
可見,在圖3所描述的方法流程中,在檢測(cè)到第二關(guān)鍵事件且系統(tǒng)處于空閑狀態(tài)時(shí)確定當(dāng)前系統(tǒng)的可用內(nèi)存小于內(nèi)存閾值,可以主動(dòng)進(jìn)行內(nèi)存回收,當(dāng)應(yīng)用程序真正需要大量?jī)?nèi)存的時(shí)候,系統(tǒng)內(nèi)核已經(jīng)回收回來(lái)大量可用的內(nèi)存,從而可以減少終端出現(xiàn)卡頓現(xiàn)象的概率。
請(qǐng)參見圖4,圖4是本發(fā)明實(shí)施例公開的另一種內(nèi)存回收方法的流程示意圖。其中,該方法可以應(yīng)用于圖1所示的內(nèi)存管控模塊1223,具體的,內(nèi)存管控模塊1223可以是一個(gè)或多個(gè)線程,或者,內(nèi)存管控模塊1223可以是一個(gè)或多個(gè)進(jìn)程。如圖4所示,該方法可以包括以下步驟。
401、在檢測(cè)到第二關(guān)鍵事件時(shí),確定當(dāng)前系統(tǒng)的可用內(nèi)存小于內(nèi)存閾值。
其中,第二關(guān)鍵事件具體可以參照?qǐng)D3中所描述的,在此不再贅述,內(nèi)存閾值具體可以參照?qǐng)D2所描述的,在此不再贅述。
本發(fā)明實(shí)施例中,圖3所示的實(shí)施例是在檢測(cè)到第二關(guān)鍵事件時(shí)先判斷系統(tǒng)是否處于空閑狀態(tài),在確定系統(tǒng)處于空閑狀態(tài)時(shí)再去讀取當(dāng)前系統(tǒng)的可用內(nèi)存,而圖4所示的實(shí)施例是在檢測(cè)到第二關(guān)鍵事件時(shí),先讀取當(dāng)前系統(tǒng)的可用內(nèi)存,在確定當(dāng)前系統(tǒng)的可用內(nèi)存小于內(nèi)存閾值的情況下,再判斷系統(tǒng)是否處于空閑狀態(tài),在確定系統(tǒng)處于空閑狀態(tài)時(shí),執(zhí)行步驟402。
402、在確定系統(tǒng)處于空閑狀態(tài)時(shí)創(chuàng)建后臺(tái)進(jìn)程列表。
403、從后臺(tái)進(jìn)程列表中確定待回收內(nèi)存的進(jìn)程。
404、向系統(tǒng)內(nèi)核發(fā)送處理指令,以觸發(fā)系統(tǒng)內(nèi)核對(duì)待回收內(nèi)存的進(jìn)程進(jìn)行處理以回收待回收內(nèi)存的進(jìn)程對(duì)應(yīng)的內(nèi)存。
可見,在圖4所描述的方法流程中,在檢測(cè)到第二關(guān)鍵事件并確定系統(tǒng)當(dāng)前的可用內(nèi)存小于內(nèi)存閾值時(shí),可以在系統(tǒng)處于空閑狀態(tài)時(shí)主動(dòng)進(jìn)行內(nèi)存回收,當(dāng)應(yīng)用程序真正需要大量?jī)?nèi)存的時(shí)候,系統(tǒng)內(nèi)核已經(jīng)回收回來(lái)大量可用的內(nèi)存,從而可以減少終端出現(xiàn)卡頓現(xiàn)象的概率。
請(qǐng)參見圖5,圖5是本發(fā)明實(shí)施例公開的一種內(nèi)存回收裝置的結(jié)構(gòu)示意圖。其中,該內(nèi)存回收裝置可以用于執(zhí)行圖2~圖4中所描述的內(nèi)存回收方法的部分或全部步驟,具體請(qǐng)參見圖2~圖4中的相關(guān)描述,在此不再贅述。如圖5所示,該內(nèi)存回收裝置500可以包括:
確定單元501,用于在確定系統(tǒng)當(dāng)前的可用內(nèi)存小于內(nèi)存閾值時(shí),從后臺(tái)進(jìn)程列表中確定待回收內(nèi)存的進(jìn)程,其中,所述后臺(tái)進(jìn)程列表包括一個(gè)或多個(gè)應(yīng)用的進(jìn)程,所述待回收內(nèi)存的進(jìn)程為所述一個(gè)或多個(gè)應(yīng)用的進(jìn)程中滿足進(jìn)程所占用內(nèi)存與內(nèi)存壓力值的差值的絕對(duì)值小于預(yù)設(shè)閾值的條件的進(jìn)程,所述內(nèi)存壓力值為所述內(nèi)存閾值與所述系統(tǒng)當(dāng)前的可用內(nèi)存的差值;
發(fā)送單元502,用于向系統(tǒng)內(nèi)核發(fā)送處理指令,以觸發(fā)所述系統(tǒng)內(nèi)核對(duì)所述待回收內(nèi)存的進(jìn)程進(jìn)行處理以回收所述待回收內(nèi)存的進(jìn)程所占用的內(nèi)存。
其中,可選的,在檢測(cè)到第一關(guān)鍵事件時(shí)觸發(fā)所述確定系統(tǒng)當(dāng)前的可用內(nèi)存小于內(nèi)存閾值的操作,且所述內(nèi)存閾值為與所述第一關(guān)鍵事件對(duì)應(yīng)的第一內(nèi)存閾值。所述第一關(guān)鍵事件包括如下事件中的任意一種:程序啟動(dòng)開始事件、清理事件以及內(nèi)存不足oom事件。
其中,可選的,在檢測(cè)到第二關(guān)鍵事件且確定系統(tǒng)處于空閑狀態(tài)時(shí)觸發(fā)所述確定當(dāng)前系統(tǒng)的可用內(nèi)存小于內(nèi)存閾值的操作,且所述內(nèi)存閾值為與所述第二關(guān)鍵事件對(duì)應(yīng)的第二內(nèi)存閾值。
其中,可選的,在檢測(cè)到第二關(guān)鍵事件時(shí)觸發(fā)所述確定當(dāng)前系統(tǒng)的可用內(nèi)存小于內(nèi)存閾值的操作,在確定系統(tǒng)處于空閑狀態(tài)時(shí)觸發(fā)所述從后臺(tái)進(jìn)程列表中選擇待回收內(nèi)存的進(jìn)程的操作,且所述內(nèi)存閾值為與所述第二關(guān)鍵事件對(duì)應(yīng)的第二內(nèi)存閾值。所述第二關(guān)鍵事件包括如下事件中的任意一種:程序啟動(dòng)完成事件、亮屏事件、滅屏事件、觸屏事件、界面切換事件、任務(wù)切換完成事件以及廣播事件。
可選的,所述確定單元501具體用于:
判斷所述系統(tǒng)當(dāng)前的負(fù)載是否小于負(fù)載閾值;
在所述系統(tǒng)當(dāng)前的負(fù)載小于所述負(fù)載閾值的情況下,確定系統(tǒng)處于空閑狀態(tài)。
可選的,在確定出的所述待回收的進(jìn)程為多個(gè)的情況下,所述發(fā)送單元502具體用于:
調(diào)用多個(gè)線程向系統(tǒng)內(nèi)核發(fā)送多個(gè)處理指令,其中,每個(gè)所述線程用于發(fā)送一個(gè)或多個(gè)處理指令。
可選的,所述確定單元501具體用于:
根據(jù)應(yīng)用的重要程度從低到高的順序,從所述后臺(tái)進(jìn)程列表包括的多個(gè)應(yīng)用中確定至少一個(gè)應(yīng)用;
根據(jù)進(jìn)程優(yōu)先級(jí)從低到高的順序,從所述至少一個(gè)應(yīng)用包括的進(jìn)程中確定待回收內(nèi)存的進(jìn)程。
可選的,所述內(nèi)存回收裝置還包括:
創(chuàng)建單元503,用于在所述確定單元501確定所述系統(tǒng)當(dāng)前的可用內(nèi)存小于所述內(nèi)存閾值時(shí)創(chuàng)建所述后臺(tái)進(jìn)程列表,或,用于在所述確定單元501確定所述系統(tǒng)當(dāng)前的可用內(nèi)存小于所述內(nèi)存閾值并且所述系統(tǒng)處于空閑狀態(tài)時(shí)創(chuàng)建所述后臺(tái)進(jìn)程列表。
可選的,創(chuàng)建單元503具體用于:
確定當(dāng)前在后臺(tái)運(yùn)行的每個(gè)應(yīng)用的關(guān)鍵因素的分值,所述關(guān)鍵因素包括以下中的一個(gè)或多個(gè):進(jìn)程優(yōu)先級(jí)、用戶使用習(xí)慣、進(jìn)程占用系統(tǒng)資源以及應(yīng)用的關(guān)聯(lián)關(guān)系;
針對(duì)每個(gè)所述應(yīng)用,將所有所述關(guān)鍵因素的分值進(jìn)行加權(quán)計(jì)算,獲得所述應(yīng)用的重要程度;
根據(jù)所有所述應(yīng)用的重要程度,對(duì)所有所述應(yīng)用進(jìn)行排序;
根據(jù)進(jìn)程優(yōu)先級(jí),對(duì)排序后的每個(gè)所述應(yīng)用包括的進(jìn)程進(jìn)行排序,以生成后臺(tái)進(jìn)程列表。
在圖5所描述的內(nèi)存回收裝置中,在確定系統(tǒng)當(dāng)前的可用內(nèi)存小于內(nèi)存閾值時(shí),可以主動(dòng)進(jìn)行內(nèi)存回收,當(dāng)應(yīng)用程序真正需要大量?jī)?nèi)存的時(shí)候,系統(tǒng)內(nèi)核已經(jīng)回收回來(lái)大量可用的內(nèi)存,從而可以減少終端出現(xiàn)卡頓現(xiàn)象的概率。
請(qǐng)參見圖6,圖6是本發(fā)明實(shí)施例公開的一種終端的結(jié)構(gòu)示意圖。其中,該終端可以用于執(zhí)行圖2~圖4中所描述的內(nèi)存回收方法的部分或全部步驟,具體請(qǐng)參見圖2~圖4中的相關(guān)描述,在此不再贅述。如圖6所示,終端600包括:射頻(radiofrequency,rf)電路601、存儲(chǔ)器602、輸入單元603、顯示單元604、傳感器605、音頻電路606、無(wú)線保真(wirelessfidelity,wifi)模塊607、處理器608、以及電源609等部件。本領(lǐng)域技術(shù)人員可以理解,圖6中示出的終端結(jié)構(gòu)并不構(gòu)成對(duì)手機(jī)的限定,可以包括比圖示更多或更少的部件,或者組合某些部件,或者不同的部件布置。
rf電路601可用于收發(fā)信息或通話過(guò)程中,信號(hào)的接收和發(fā)送,特別地,將基站的下行信息接收后,給處理器608處理;另外,將設(shè)計(jì)上行的數(shù)據(jù)發(fā)送給基站。通常,rf電路601包括但不限于天線、至少一個(gè)放大器、收發(fā)信機(jī)、耦合器、低噪聲放大器(lownoiseamplifier,lna)、雙工器等。此外,rf電路601還可以通過(guò)無(wú)線通信與網(wǎng)絡(luò)和其他設(shè)備通信。上述無(wú)線通信可以使用任一通信標(biāo)準(zhǔn)或協(xié)議,包括但不限于全球移動(dòng)通訊系統(tǒng)(globalsystemofmobilecommunication,gsm)、通用分組無(wú)線服務(wù)(generalpacketradioservice,gprs)、碼分多址(codedivisionmultipleaccess,cdma)、寬帶碼分多址(widebandcodedivisionmultipleaccess,wcdma)、長(zhǎng)期演進(jìn)(longtermevolution,lte)、電子郵件、短消息服務(wù)(shortmessagingservice,sms)等。
存儲(chǔ)器602存儲(chǔ)計(jì)算機(jī)程序,該計(jì)算機(jī)程序包括應(yīng)用程序6021和操作系統(tǒng)程序6022,處理器608用于讀取存儲(chǔ)器602中的計(jì)算機(jī)程序,然后執(zhí)行計(jì)算機(jī)程序定義的方法,例如處理器608讀取操作系統(tǒng)程序6022從而在該終端600上運(yùn)行操作系統(tǒng)以及實(shí)現(xiàn)操作系統(tǒng)的各種功能,或讀取一種或多種應(yīng)用程序6021,從而在該終端600上運(yùn)行應(yīng)用。操作系統(tǒng)6022中包含了可實(shí)現(xiàn)本發(fā)明實(shí)施例提供的內(nèi)存回收方法的計(jì)算機(jī)程序,從而使得處理器608讀取到該操作系統(tǒng)程序6022并運(yùn)行該操作系統(tǒng)后,該操作系統(tǒng)可具備本發(fā)明實(shí)施例提供的內(nèi)存回收功能。另外,存儲(chǔ)器602還存儲(chǔ)有除計(jì)算機(jī)程序之外的其他數(shù)據(jù)6023,其他數(shù)據(jù)6023可包括操作系統(tǒng)6022或應(yīng)用程序6021被運(yùn)行后產(chǎn)生的數(shù)據(jù),該數(shù)據(jù)包括系統(tǒng)數(shù)據(jù)(例如操作系統(tǒng)的配置參數(shù))和用戶數(shù)據(jù)。此外,存儲(chǔ)器602一般包括內(nèi)存和外存。內(nèi)存可以為隨機(jī)存儲(chǔ)器(ram),只讀存儲(chǔ)器(rom),以及高速緩存(cache)等。外存可以為硬盤、光盤、usb盤、軟盤或磁帶機(jī)等。計(jì)算機(jī)程序通常被存儲(chǔ)在外存上,處理器在執(zhí)行處理前會(huì)將計(jì)算機(jī)程序從外存加載到內(nèi)存。
輸入單元603可用于接收輸入的數(shù)字或字符信息,以及產(chǎn)生與終端600的用戶設(shè)置以及功能控制有關(guān)的鍵信號(hào)輸入。具體地,輸入單元603可包括觸控面板6031以及其他輸入設(shè)備6032。觸控面板6031,也稱為觸摸屏,可收集用戶在其上或附近的觸摸操作(比如用戶使用手指、觸筆等任何適合的物體或附件在觸控面板6031上或在觸控面板6031附近的操作),并根據(jù)預(yù)先設(shè)定的程式驅(qū)動(dòng)相應(yīng)的連接裝置??蛇x的,觸控面板6031可包括觸摸檢測(cè)裝置和觸摸控制器兩個(gè)部分。其中,觸摸檢測(cè)裝置檢測(cè)用戶的觸摸方位,并檢測(cè)觸摸操作帶來(lái)的信號(hào),將信號(hào)傳送給觸摸控制器;觸摸控制器從觸摸檢測(cè)裝置上接收觸摸信息,并將它轉(zhuǎn)換成觸點(diǎn)坐標(biāo),再送給處理器608,并能接收處理器608發(fā)來(lái)的命令并加以執(zhí)行。此外,可以采用電阻式、電容式、紅外線以及表面聲波等多種類型實(shí)現(xiàn)觸控面板6031。除了觸控面板6031,輸入單元603還可以包括其他輸入設(shè)備6032。具體地,其他輸入設(shè)備6032可以包括但不限于物理鍵盤、功能鍵(比如音量控制按鍵、開關(guān)按鍵等)、軌跡球、鼠標(biāo)、操作桿等中的一種或多種。
顯示單元604可用于顯示由用戶輸入的信息或提供給用戶的信息以及手機(jī)的各種菜單。顯示單元604可包括顯示面板6041,可選的,可以采用液晶顯示器(liquidcrystaldisplay,lcd)、有機(jī)發(fā)光二極管(organiclight-emittingdiode,oled)等形式來(lái)配置顯示面板6041。進(jìn)一步的,觸控面板6031可覆蓋顯示面板6041,當(dāng)觸控面板6031檢測(cè)到在其上或附近的觸摸操作后,傳送給處理器608以確定觸摸事件的類型,隨后處理器608根據(jù)觸摸事件的類型在顯示面板6041上提供相應(yīng)的視覺輸出。雖然在圖6中,觸控面板6031與顯示面板6041是作為兩個(gè)獨(dú)立的部件來(lái)實(shí)現(xiàn)手機(jī)的輸入和輸入功能,但是在某些實(shí)施例中,可以將觸控面板6031與顯示面板6041集成而實(shí)現(xiàn)手機(jī)的輸入和輸出功能。
傳感器605可以為光傳感器、運(yùn)動(dòng)傳感器以及其他傳感器。具體地,光傳感器可包括環(huán)境光傳感器及接近傳感器,其中,環(huán)境光傳感器可根據(jù)環(huán)境光線的明暗來(lái)調(diào)節(jié)顯示面板6041的亮度,接近傳感器可在手機(jī)移動(dòng)到耳邊時(shí),關(guān)閉顯示面板6041和/或背光。作為運(yùn)動(dòng)傳感器的一種,加速計(jì)傳感器可檢測(cè)各個(gè)方向上(一般為三軸)加速度的大小,靜止時(shí)可檢測(cè)出重力的大小及方向,可用于識(shí)別手機(jī)姿態(tài)的應(yīng)用(比如橫豎屏切換、相關(guān)游戲、磁力計(jì)姿態(tài)校準(zhǔn))、振動(dòng)識(shí)別相關(guān)功能(比如計(jì)步器、敲擊)等;至于手機(jī)還可配置的陀螺儀、氣壓計(jì)、濕度計(jì)、溫度計(jì)、紅外線傳感器等其他傳感器,在此不再贅述。
音頻電路606、揚(yáng)聲器6061,傳聲器6062可提供用戶與手機(jī)之間的音頻接口。音頻電路606可將接收到的音頻數(shù)據(jù)轉(zhuǎn)換后的電信號(hào),傳輸?shù)綋P(yáng)聲器6061,由揚(yáng)聲器6061轉(zhuǎn)換為聲音信號(hào)輸出;另一方面,傳聲器6062將收集的聲音信號(hào)轉(zhuǎn)換為電信號(hào),由音頻電路606接收后轉(zhuǎn)換為音頻數(shù)據(jù),再將音頻數(shù)據(jù)輸出處理器608處理后,經(jīng)rf電路601以發(fā)送給比如另一手機(jī),或者將音頻數(shù)據(jù)輸出至存儲(chǔ)器602以便進(jìn)一步處理。
wifi屬于短距離無(wú)線傳輸技術(shù),終端通過(guò)wifi模塊607可以幫助用戶收發(fā)電子郵件、瀏覽網(wǎng)頁(yè)和訪問(wèn)流式媒體等,它為用戶提供了無(wú)線的寬帶互聯(lián)網(wǎng)訪問(wèn)。雖然圖6示出了wifi模塊607,但是可以理解的是,其并不屬于終端的必須構(gòu)成,完全可以根據(jù)需要在不改變發(fā)明的本質(zhì)的范圍內(nèi)而省略。
處理器608是終端的控制中心,利用各種接口和線路連接整個(gè)終端的各個(gè)部分,通過(guò)運(yùn)行或執(zhí)行存儲(chǔ)在存儲(chǔ)器602內(nèi)的軟件程序和/或模塊,以及調(diào)用存儲(chǔ)在存儲(chǔ)器602內(nèi)的數(shù)據(jù),執(zhí)行終端的各種功能和處理數(shù)據(jù),從而對(duì)終端進(jìn)行整體監(jiān)控。可選的,處理器608可以包括一個(gè)或多個(gè)處理器,例如,處理器608可以包括一個(gè)或多個(gè)中央處理器,或者包括一個(gè)中央處理器和一個(gè)圖形處理器。當(dāng)處理器608包括多個(gè)處理器時(shí),這多個(gè)處理器可以集成在同一塊芯片上,也可以各自為獨(dú)立的芯片。一個(gè)處理器可以包括一個(gè)或多個(gè)處理核。
終端600還包括給各個(gè)部件供電的電源609(比如電池),優(yōu)選的,電源可以通過(guò)電源管理系統(tǒng)與處理器608邏輯相連,從而通過(guò)電源管理系統(tǒng)實(shí)現(xiàn)管理充電、放電、以及功耗管理等功能。
盡管未示出,終端還可以包括攝像頭、藍(lán)牙模塊等,在此不再贅述。
前述實(shí)施例中,各步驟方法流程可以基于該終端的結(jié)構(gòu)實(shí)現(xiàn)。其中應(yīng)用層和操作系統(tǒng)內(nèi)核均可視為處理器608的抽象化結(jié)構(gòu)的組成部分。
在本發(fā)明實(shí)施例中,處理器608通過(guò)調(diào)用存儲(chǔ)于存儲(chǔ)器602中的程序代碼,用于執(zhí)行以下操作:
在確定系統(tǒng)當(dāng)前的可用內(nèi)存小于內(nèi)存閾值時(shí),從后臺(tái)進(jìn)程列表中確定待回收內(nèi)存的進(jìn)程,其中,所述后臺(tái)進(jìn)程列表包括一個(gè)或多個(gè)應(yīng)用的進(jìn)程,所述待回收內(nèi)存的進(jìn)程為所述一個(gè)或多個(gè)應(yīng)用的進(jìn)程中滿足進(jìn)程所占用內(nèi)存與內(nèi)存壓力值的差值的絕對(duì)值小于預(yù)設(shè)閾值的條件的進(jìn)程,所述內(nèi)存壓力值為所述內(nèi)存閾值與所述系統(tǒng)當(dāng)前的可用內(nèi)存的差值;
向系統(tǒng)內(nèi)核發(fā)送處理指令,以觸發(fā)所述系統(tǒng)內(nèi)核對(duì)所述待回收內(nèi)存的進(jìn)程進(jìn)行處理以回收所述待回收內(nèi)存的進(jìn)程所占用的內(nèi)存。
其中,在檢測(cè)到第一關(guān)鍵事件時(shí)觸發(fā)所述確定系統(tǒng)當(dāng)前的可用內(nèi)存小于內(nèi)存閾值的操作,且所述內(nèi)存閾值為與所述第一關(guān)鍵事件對(duì)應(yīng)的第一內(nèi)存閾值。
其中,所述第一關(guān)鍵事件包括如下事件中的任意一種:程序啟動(dòng)開始事件、清理事件以及內(nèi)存不足oom事件。
其中,在檢測(cè)到第二關(guān)鍵事件且確定系統(tǒng)處于空閑狀態(tài)時(shí)觸發(fā)所述確定當(dāng)前系統(tǒng)的可用內(nèi)存小于內(nèi)存閾值的操作,且所述內(nèi)存閾值為與所述第二關(guān)鍵事件對(duì)應(yīng)的第二內(nèi)存閾值。
其中,在檢測(cè)到第二關(guān)鍵事件時(shí)觸發(fā)所述確定當(dāng)前系統(tǒng)的可用內(nèi)存小于內(nèi)存閾值的操作,在確定系統(tǒng)處于空閑狀態(tài)時(shí)觸發(fā)所述從后臺(tái)進(jìn)程列表中選擇待回收內(nèi)存的進(jìn)程的操作,且所述內(nèi)存閾值為與所述第二關(guān)鍵事件對(duì)應(yīng)的第二內(nèi)存閾值。
其中,所述第二關(guān)鍵事件包括如下事件中的任意一種:程序啟動(dòng)完成事件、亮屏事件、滅屏事件、觸屏事件、界面切換事件、任務(wù)切換完成事件以及廣播事件。
作為另一種可選的實(shí)施方式,所述處理器608確定系統(tǒng)處于空閑狀態(tài)包括:
判斷所述系統(tǒng)當(dāng)前的負(fù)載是否小于負(fù)載閾值;
在所述系統(tǒng)當(dāng)前的負(fù)載小于所述負(fù)載閾值的情況下,確定系統(tǒng)處于空閑狀態(tài)。
作為另一種可選的實(shí)施方式,在確定出的所述待回收的進(jìn)程為多個(gè)的情況下,所述處理器608向系統(tǒng)內(nèi)核發(fā)送處理指令包括:
調(diào)用多個(gè)線程向系統(tǒng)內(nèi)核發(fā)送多個(gè)處理指令,其中,每個(gè)所述線程用于發(fā)送一個(gè)或多個(gè)處理指令。
作為另一種可選的實(shí)施方式,所述處理器608從后臺(tái)進(jìn)程列表中確定待回收內(nèi)存的進(jìn)程包括:
根據(jù)應(yīng)用的重要程度從低到高的順序,從所述后臺(tái)進(jìn)程列表包括的多個(gè)應(yīng)用中確定至少一個(gè)應(yīng)用;
根據(jù)進(jìn)程優(yōu)先級(jí)從低到高的順序,從所述至少一個(gè)應(yīng)用包括的進(jìn)程中確定待回收內(nèi)存的進(jìn)程。
作為另一種可選的實(shí)施方式,所述處理器608通過(guò)調(diào)用存儲(chǔ)于存儲(chǔ)器602中的程序代碼,還用于執(zhí)行以下操作:
在確定所述系統(tǒng)當(dāng)前的可用內(nèi)存小于所述內(nèi)存閾值時(shí)創(chuàng)建所述后臺(tái)進(jìn)程列表。
作為另一種可選的實(shí)施方式,所述處理器608通過(guò)調(diào)用存儲(chǔ)于存儲(chǔ)器602中的程序代碼,還用于執(zhí)行以下操作:
在確定所述系統(tǒng)當(dāng)前的可用內(nèi)存小于所述內(nèi)存閾值并且所述系統(tǒng)處于空閑狀態(tài)時(shí)創(chuàng)建所述后臺(tái)進(jìn)程列表。
作為另一種可選的實(shí)施方式,所述處理器608創(chuàng)建所述后臺(tái)進(jìn)程列表包括:
確定當(dāng)前在后臺(tái)運(yùn)行的每個(gè)應(yīng)用的關(guān)鍵因素的分值,所述關(guān)鍵因素包括以下中的一個(gè)或多個(gè):進(jìn)程優(yōu)先級(jí)、用戶使用習(xí)慣、進(jìn)程占用系統(tǒng)資源以及應(yīng)用的關(guān)聯(lián)關(guān)系;
針對(duì)每個(gè)所述應(yīng)用,將所有所述關(guān)鍵因素的分值進(jìn)行加權(quán)計(jì)算,獲得所述應(yīng)用的重要程度;
根據(jù)所有所述應(yīng)用的重要程度,對(duì)所有所述應(yīng)用進(jìn)行排序;
根據(jù)進(jìn)程優(yōu)先級(jí),對(duì)排序后的每個(gè)所述應(yīng)用包括的進(jìn)程進(jìn)行排序,以生成后臺(tái)進(jìn)程列表。
在圖6所描述的終端600中,可以在確定系統(tǒng)當(dāng)前的可用內(nèi)存小于內(nèi)存閾值時(shí),可以主動(dòng)進(jìn)行內(nèi)存回收,當(dāng)應(yīng)用程序真正需要大量?jī)?nèi)存的時(shí)候,系統(tǒng)內(nèi)核已經(jīng)回收回來(lái)大量可用的內(nèi)存,從而可以減少終端出現(xiàn)卡頓現(xiàn)象的概率。
需要說(shuō)明的是,對(duì)于前述的各方法實(shí)施例,為了簡(jiǎn)單描述,故將其都表述為一系列的動(dòng)作組合,但是本領(lǐng)域技術(shù)人員應(yīng)該知悉,本發(fā)明并不受所描述的動(dòng)作順序的限制,因?yàn)橐罁?jù)本發(fā)明,某些步驟可以采用其他順序或者同時(shí)進(jìn)行。其次,本領(lǐng)域技術(shù)人員也應(yīng)該知悉,說(shuō)明書中所描述的實(shí)施例均屬于優(yōu)選實(shí)施例,所涉及的動(dòng)作和模塊并不一定是本發(fā)明所必須的。
在上述實(shí)施例中,對(duì)各個(gè)實(shí)施例的描述都各有側(cè)重,某個(gè)實(shí)施例中沒(méi)有詳述的部分,可以參見其他實(shí)施例的相關(guān)描述。
在本申請(qǐng)所提供的幾個(gè)實(shí)施例中,應(yīng)該理解到,所揭露的裝置,可通過(guò)其它的方式實(shí)現(xiàn)。例如,以上所描述的裝置實(shí)施例僅僅是示意性的,例如所述單元的劃分,僅僅為一種邏輯功能劃分,實(shí)際實(shí)現(xiàn)時(shí)可以有另外的劃分方式,例如多個(gè)單元或組件可以結(jié)合或者可以集成到另一個(gè)系統(tǒng),或一些特征可以忽略,或不執(zhí)行。另一點(diǎn),所顯示或討論的相互之間的耦合或直接耦合或通信連接可以是通過(guò)一些接口,裝置或單元的間接耦合或通信連接,可以是電性或其它的形式。
所述作為分離部件說(shuō)明的單元可以是或者也可以不是物理上分開的,作為單元顯示的部件可以是或者也可以不是物理單元,即可以位于一個(gè)地方,或者也可以分布到多個(gè)網(wǎng)絡(luò)單元上??梢愿鶕?jù)實(shí)際的需要選擇其中的部分或者全部單元來(lái)實(shí)現(xiàn)本實(shí)施例方案的目的。
另外,在本發(fā)明各個(gè)實(shí)施例中的各功能單元可以集成在一個(gè)處理單元中,也可以是各個(gè)單元單獨(dú)物理存在,也可以兩個(gè)或兩個(gè)以上單元集成在一個(gè)單元中。上述集成的單元既可以采用硬件的形式實(shí)現(xiàn),也可以采用軟件功能單元的形式實(shí)現(xiàn)。
所述集成的單元如果以軟件功能單元的形式實(shí)現(xiàn)并作為獨(dú)立的產(chǎn)品銷售或使用時(shí),可以存儲(chǔ)在一個(gè)計(jì)算機(jī)可讀取存儲(chǔ)器中?;谶@樣的理解,本發(fā)明的技術(shù)方案本質(zhì)上或者說(shuō)對(duì)現(xiàn)有技術(shù)做出貢獻(xiàn)的部分或者該技術(shù)方案的全部或部分可以以軟件產(chǎn)品的形式體現(xiàn)出來(lái),該計(jì)算機(jī)軟件產(chǎn)品存儲(chǔ)在一個(gè)存儲(chǔ)器中,包括若干指令用以使得一臺(tái)計(jì)算機(jī)設(shè)備(可為個(gè)人計(jì)算機(jī)、服務(wù)器或者網(wǎng)絡(luò)設(shè)備等)執(zhí)行本發(fā)明各個(gè)實(shí)施例所述方法的全部或部分步驟。而前述的存儲(chǔ)器包括:u盤、只讀存儲(chǔ)器(rom,read-onlymemory)、隨機(jī)存取存儲(chǔ)器(ram,randomaccessmemory)、移動(dòng)硬盤、磁碟或者光盤等各種可以存儲(chǔ)程序代碼的介質(zhì)。
本領(lǐng)域普通技術(shù)人員可以理解上述實(shí)施例的各種方法中的全部或部分步驟是可以通過(guò)程序來(lái)指令相關(guān)的硬件來(lái)完成,該程序可以存儲(chǔ)于一計(jì)算機(jī)可讀存儲(chǔ)器中,存儲(chǔ)器可以包括:閃存盤、只讀存儲(chǔ)器(英文:read-onlymemory,簡(jiǎn)稱:rom)、隨機(jī)存取器(英文:randomaccessmemory,簡(jiǎn)稱:ram)、磁盤或光盤等。
以上對(duì)本發(fā)明實(shí)施例進(jìn)行了詳細(xì)介紹,本文中應(yīng)用了具體個(gè)例對(duì)本發(fā)明的原理及實(shí)施方式進(jìn)行了闡述,以上實(shí)施例的說(shuō)明只是用于幫助理解本發(fā)明的方法及其核心思想;同時(shí),對(duì)于本領(lǐng)域的一般技術(shù)人員,依據(jù)本發(fā)明的思想,在具體實(shí)施方式及應(yīng)用范圍上均會(huì)有改變之處,綜上所述,本說(shuō)明書內(nèi)容不應(yīng)理解為對(duì)本發(fā)明的限制。