亚洲成年人黄色一级片,日本香港三级亚洲三级,黄色成人小视频,国产青草视频,国产一区二区久久精品,91在线免费公开视频,成年轻人网站色直接看

內(nèi)存管理方法及裝置與流程

文檔序號(hào):12786198閱讀:250來源:國知局
內(nèi)存管理方法及裝置與流程

本發(fā)明涉及網(wǎng)絡(luò)通信技術(shù)領(lǐng)域,具體涉及一種內(nèi)存管理方法及裝置。



背景技術(shù):

在安卓(Android)系統(tǒng)中,應(yīng)用程序的內(nèi)存資源屬于緊缺資源。對(duì)于應(yīng)用,尤其是工具類應(yīng)用來說,內(nèi)存占用情況更是衡量應(yīng)用程序是否異常的重要指標(biāo)之一。當(dāng)應(yīng)用程序的內(nèi)存占用量過大時(shí),將會(huì)導(dǎo)致系統(tǒng)卡慢,甚至導(dǎo)致應(yīng)用程序的內(nèi)存耗盡(Out of memory,簡稱OOM)問題。

為此,需要監(jiān)測系統(tǒng)中各個(gè)進(jìn)程的內(nèi)存占用情況,并根據(jù)內(nèi)存占用情況對(duì)內(nèi)存資源進(jìn)行管理?,F(xiàn)有技術(shù)中,在Android系統(tǒng)中檢測進(jìn)程的內(nèi)存占用情況時(shí),通常是針對(duì)某一進(jìn)程分析該進(jìn)程在特定的一個(gè)時(shí)刻的內(nèi)存占用情況,并根據(jù)該時(shí)刻的內(nèi)存占用情況進(jìn)行管理。在這種方式中,僅根據(jù)一個(gè)時(shí)刻的內(nèi)存占用情況來監(jiān)測進(jìn)程的內(nèi)存狀態(tài),無法連續(xù)獲取一段時(shí)間內(nèi)的內(nèi)存變化情況,因而無法確定內(nèi)存占用情況的動(dòng)態(tài)變化規(guī)律,進(jìn)而導(dǎo)致內(nèi)存管理的效果不佳。



技術(shù)實(shí)現(xiàn)要素:

鑒于上述問題,提出了本發(fā)明以便提供一種克服上述問題或者至少部分地解決上述問題的內(nèi)存管理方法及裝置。

依據(jù)本發(fā)明的一個(gè)方面,提供了一種內(nèi)存管理方法,包括:獲取并解析內(nèi)存信息文件,以獲得系統(tǒng)中的各個(gè)進(jìn)程在多個(gè)時(shí)間點(diǎn)所對(duì)應(yīng)的進(jìn)程內(nèi)存映像;根據(jù)進(jìn)程內(nèi)存映像確定各個(gè)進(jìn)程中的各個(gè)對(duì)象所占用的內(nèi)存塊的動(dòng)態(tài)變化情況;根據(jù)動(dòng)態(tài)變化情況判斷各個(gè)對(duì)象所占用的內(nèi)存塊是否符合預(yù)設(shè)的回收條件,并在判斷結(jié)果為是時(shí),對(duì)符合回收條件的內(nèi)存塊進(jìn)行回收。

依據(jù)本發(fā)明的另一方面,提供了一種內(nèi)存管理裝置,包括:解析模塊, 適于獲取并解析內(nèi)存信息文件,以獲得系統(tǒng)中的各個(gè)進(jìn)程在多個(gè)時(shí)間點(diǎn)所對(duì)應(yīng)的進(jìn)程內(nèi)存映像;分析模塊,適于根據(jù)所述進(jìn)程內(nèi)存映像確定各個(gè)進(jìn)程中的各個(gè)對(duì)象所占用的內(nèi)存塊的動(dòng)態(tài)變化情況;回收模塊,適于根據(jù)所述動(dòng)態(tài)變化情況判斷各個(gè)對(duì)象所占用的內(nèi)存塊是否符合預(yù)設(shè)的回收條件,并在判斷結(jié)果為是時(shí),對(duì)符合所述回收條件的內(nèi)存塊進(jìn)行回收。

在本發(fā)明提供的內(nèi)存管理方法及裝置中,通過解析內(nèi)存信息文件來獲得系統(tǒng)中的各個(gè)進(jìn)程在多個(gè)時(shí)間點(diǎn)所對(duì)應(yīng)的進(jìn)程內(nèi)存映像,從而根據(jù)進(jìn)程內(nèi)存映像確定各個(gè)進(jìn)程中的各個(gè)對(duì)象所占用的內(nèi)存塊的動(dòng)態(tài)變化情況,根據(jù)動(dòng)態(tài)變化情況判斷各個(gè)對(duì)象所占用的內(nèi)存塊是否符合預(yù)設(shè)的回收條件。由于本發(fā)明中能夠獲取各個(gè)進(jìn)程在連續(xù)的一段時(shí)間內(nèi)的多個(gè)時(shí)間點(diǎn)(而非一個(gè)時(shí)間點(diǎn))所對(duì)應(yīng)的進(jìn)程內(nèi)存映像,從而能夠確定內(nèi)存占用情況的動(dòng)態(tài)變化規(guī)律,進(jìn)而根據(jù)該動(dòng)態(tài)變化規(guī)律進(jìn)行內(nèi)存管理,使得內(nèi)存資源得到更加合理的利用。

上述說明僅是本發(fā)明技術(shù)方案的概述,為了能夠更清楚了解本發(fā)明的技術(shù)手段,而可依照說明書的內(nèi)容予以實(shí)施,并且為了讓本發(fā)明的上述和其它目的、特征和優(yōu)點(diǎn)能夠更明顯易懂,以下特舉本發(fā)明的具體實(shí)施方式。

附圖說明

通過閱讀下文優(yōu)選實(shí)施方式的詳細(xì)描述,各種其他的優(yōu)點(diǎn)和益處對(duì)于本領(lǐng)域普通技術(shù)人員將變得清楚明了。附圖僅用于示出優(yōu)選實(shí)施方式的目的,而并不認(rèn)為是對(duì)本發(fā)明的限制。而且在整個(gè)附圖中,用相同的參考符號(hào)表示相同的部件。在附圖中:

圖1示出了本發(fā)明一個(gè)實(shí)施例提供的內(nèi)存管理方法的流程圖;

圖2示出了本發(fā)明一個(gè)具體實(shí)施例提供的內(nèi)存管理方法的流程圖;

圖3示出了代碼為23224的進(jìn)程在一個(gè)時(shí)間點(diǎn)的內(nèi)存占用信息;

圖4示出了本發(fā)明另一具體實(shí)施例提供的內(nèi)存管理方法的流程圖;以及,

圖5示出了本發(fā)明實(shí)施例提供的一種內(nèi)存管理裝置的結(jié)構(gòu)圖。

具體實(shí)施方式

下面將參照附圖更詳細(xì)地描述本公開的示例性實(shí)施例。雖然附圖中顯示了本公開的示例性實(shí)施例,然而應(yīng)當(dāng)理解,可以以各種形式實(shí)現(xiàn)本公開而不應(yīng)被這里闡述的實(shí)施例所限制。相反,提供這些實(shí)施例是為了能夠更透徹地理解本公開,并且能夠?qū)⒈竟_的范圍完整的傳達(dá)給本領(lǐng)域的技術(shù)人員。

本發(fā)明實(shí)施例提供了一種內(nèi)存管理方法及裝置,至少能夠解決現(xiàn)有方式中無法連續(xù)獲取一段時(shí)間內(nèi)的內(nèi)存變化情況,因而無法確定內(nèi)存占用情況的動(dòng)態(tài)變化規(guī)律的技術(shù)問題。

圖1示出了本發(fā)明一個(gè)實(shí)施例提供的內(nèi)存管理方法的流程圖。如圖1所示,該方法包括:

步驟S110:獲取并解析內(nèi)存信息文件,以獲得系統(tǒng)中的各個(gè)進(jìn)程在多個(gè)時(shí)間點(diǎn)所對(duì)應(yīng)的進(jìn)程內(nèi)存映像。

其中,內(nèi)存信息文件為安卓系統(tǒng)提供的虛擬文件,或者,內(nèi)存信息文件為預(yù)先創(chuàng)建的系統(tǒng)內(nèi)存檢查文件。

步驟S120:根據(jù)進(jìn)程內(nèi)存映像確定各個(gè)進(jìn)程中的各個(gè)對(duì)象所占用的內(nèi)存塊的動(dòng)態(tài)變化情況。

其中,該動(dòng)態(tài)變化情況反映了各個(gè)進(jìn)程中的各個(gè)對(duì)象所占用的內(nèi)存塊的變化規(guī)律。

步驟S130:根據(jù)動(dòng)態(tài)變化情況判斷各個(gè)對(duì)象所占用的內(nèi)存塊是否符合預(yù)設(shè)的回收條件,并在判斷結(jié)果為是時(shí),對(duì)符合回收條件的內(nèi)存塊進(jìn)行回收。

可選地,根據(jù)動(dòng)態(tài)變化情況判斷各個(gè)對(duì)象所占用的內(nèi)存塊是否符合預(yù)設(shè)的回收條件具體包括:確定各個(gè)進(jìn)程中包含的匿名對(duì)象,其中,匿名對(duì)象包括對(duì)象數(shù)據(jù)存儲(chǔ)于堆內(nèi)存中且對(duì)象名稱未存儲(chǔ)于棧內(nèi)存中的對(duì)象;判斷匿名對(duì)象所占用的內(nèi)存塊在預(yù)設(shè)時(shí)間內(nèi)是否發(fā)生變化,當(dāng)判斷結(jié)果為否時(shí),確定該匿名對(duì)象所占用的內(nèi)存塊符合回收條件。

由于本發(fā)明中能夠獲取各個(gè)進(jìn)程在連續(xù)的一段時(shí)間內(nèi)的多個(gè)時(shí)間點(diǎn)(而非一個(gè)時(shí)間點(diǎn))所對(duì)應(yīng)的進(jìn)程內(nèi)存映像,從而能夠確定內(nèi)存占用情況的動(dòng)態(tài)變化規(guī)律,進(jìn)而根據(jù)該動(dòng)態(tài)變化規(guī)律進(jìn)行內(nèi)存管理,使得內(nèi)存資源得到更加合理的利用。

圖2示出了本發(fā)明一個(gè)具體實(shí)施例提供的內(nèi)存管理方法的流程圖,如圖2 所示,該方法包括如下步驟:

步驟S210:獲取并解析內(nèi)存信息文件。

在本步驟的一種實(shí)現(xiàn)方式中,內(nèi)存信息文件為安卓系統(tǒng)提供的虛擬文件。在安卓系統(tǒng)中,設(shè)置有proc虛擬文件系統(tǒng),該文件系統(tǒng)下面的文件并不是真實(shí)存在的,因而不占用實(shí)際存儲(chǔ)空間。該虛擬系統(tǒng)中的文件用于顯示系統(tǒng)的內(nèi)存使用信息。例如,通過proc/meminfo存儲(chǔ)路徑獲取到的內(nèi)存信息文件用于顯示物理及虛擬內(nèi)存使用情況,通過proc/kcore存儲(chǔ)路徑獲取到的內(nèi)存信息文件用于顯示內(nèi)存鏡像信息等。另外,還可以通過proc/meminfo/maps存儲(chǔ)路徑、proc/meminfo/smaps存儲(chǔ)路徑或者proc/meminfo/mem存儲(chǔ)路徑來獲取內(nèi)存信息文件。其中,maps文件可查看某一進(jìn)程的代碼段、棧區(qū)、堆區(qū)、動(dòng)態(tài)庫以及內(nèi)核區(qū)對(duì)應(yīng)的虛擬地址,但是只能簡單地顯示各個(gè)分區(qū)的內(nèi)存占用情況;smaps文件可顯示每個(gè)分區(qū)中更為詳細(xì)的內(nèi)存占用數(shù)據(jù)。

在本步驟的另一種實(shí)現(xiàn)方式中,內(nèi)存信息文件為預(yù)先創(chuàng)建的系統(tǒng)內(nèi)存檢查文件。例如,該系統(tǒng)內(nèi)存檢查文件可以為hprof文件。在生成hprof文件時(shí),既可以通過“dump hprof file”按鈕生成,也可以通過在程序中加入以下代碼生成:

void generateHprof()

{

String packageName=getApplicationInfo().packageName;

String hpFilePath="/data/data/"+packageName+"/input.hprof";

try{

//Debug.dumpHprofData("/sdcard/input.hprof");

Debug.dumpHprofData(hpFilePath);

}catch(IOException e){

//TODO Auto-generated catch block

e.printStackTrace();

}

}

上述兩種形式的內(nèi)存信息文件都可以使用,本發(fā)明對(duì)內(nèi)存信息文件的具體類型不做限定。另外,本步驟中獲取到的內(nèi)存信息文件可以是多個(gè),且可以同時(shí)包含上述兩種形式的內(nèi)存信息文件。

步驟S220:根據(jù)內(nèi)存信息文件的解析結(jié)果獲得系統(tǒng)中的各個(gè)進(jìn)程在多個(gè)時(shí)間點(diǎn)所對(duì)應(yīng)的進(jìn)程內(nèi)存映像。

通過對(duì)內(nèi)存信息文件進(jìn)行解析,能夠獲得系統(tǒng)中的各個(gè)進(jìn)程在多個(gè)時(shí)間點(diǎn)所對(duì)應(yīng)的進(jìn)程內(nèi)存映像。例如,針對(duì)特定某一進(jìn)程而言,能夠獲取到該進(jìn)程在時(shí)間點(diǎn)T1至?xí)r間點(diǎn)T2的時(shí)間段內(nèi)的多個(gè)連續(xù)時(shí)間點(diǎn)的內(nèi)存占用信息。具體地,圖3示出了代碼為23224的進(jìn)程在一個(gè)時(shí)間點(diǎn)的內(nèi)存占用信息。

在本發(fā)明的一個(gè)具體例子中,通過對(duì)hprof文件進(jìn)行解析能夠得到在該hprof文件中產(chǎn)生的對(duì)象總數(shù)(其代表了在dump hprof文件時(shí)該進(jìn)程中的java層對(duì)象總數(shù))以及在dump hprof文件時(shí)該進(jìn)程中的GC Roots數(shù)量、Class數(shù)量和ClassLoader數(shù)量。

步驟S230:根據(jù)進(jìn)程內(nèi)存映像確定各個(gè)進(jìn)程中的各個(gè)對(duì)象所占用的內(nèi)存塊的動(dòng)態(tài)變化情況。

由于進(jìn)程內(nèi)存映像包括各個(gè)時(shí)間點(diǎn)的內(nèi)存占用情況,因此,能夠根據(jù)連續(xù)時(shí)間段內(nèi)的進(jìn)程內(nèi)存映像確定各個(gè)進(jìn)程中的各個(gè)對(duì)象所占用的內(nèi)存塊的動(dòng)態(tài)變化情況。根據(jù)該動(dòng)態(tài)變化情況能夠分析出動(dòng)態(tài)變化的規(guī)律,例如,動(dòng)態(tài)增長或動(dòng)態(tài)減少或維持不變等。

步驟S240:根據(jù)動(dòng)態(tài)變化情況判斷各個(gè)對(duì)象所占用的內(nèi)存塊是否符合預(yù)設(shè)的回收條件,并在判斷結(jié)果為是時(shí),對(duì)符合回收條件的內(nèi)存塊進(jìn)行回收。

其中,預(yù)設(shè)的回收條件用于對(duì)系統(tǒng)中的內(nèi)存塊進(jìn)行回收,以便及時(shí)釋放系統(tǒng)中無用的內(nèi)存,將其合理分配給其他進(jìn)程。

具體地,在本步驟中,確定各個(gè)進(jìn)程中包含的匿名對(duì)象,其中,匿名對(duì)象包括對(duì)象數(shù)據(jù)存儲(chǔ)于堆內(nèi)存中且對(duì)象名稱未存儲(chǔ)于棧內(nèi)存中的對(duì)象;判斷匿名對(duì)象所占用的內(nèi)存塊在預(yù)設(shè)時(shí)間內(nèi)是否發(fā)生變化,當(dāng)判斷結(jié)果為否時(shí),確定該匿名對(duì)象所占用的內(nèi)存塊符合上述回收條件。

所謂匿名對(duì)象是指:在堆上生成了對(duì)象,但是在棧上卻沒有某個(gè)變量指向它。棧內(nèi)存儲(chǔ)程序中定義的變量(基本類型和引用類型),堆內(nèi)存放引用 類型引用的對(duì)象。匿名對(duì)象只開辟了實(shí)例的內(nèi)存存在于java堆內(nèi),并沒有該類型的變量引用或指向這個(gè)對(duì)象(因?yàn)樗悄涿?,所以棧內(nèi)存中沒有匿名實(shí)例的引用?;谏鲜鎏卣?,匿名對(duì)象用完一次之后,由于沒有任何引用能夠指向該匿名對(duì)象,所以該匿名對(duì)象就會(huì)變成系統(tǒng)中的垃圾資源。在本實(shí)施例中,當(dāng)確定一個(gè)匿名對(duì)象所占用的內(nèi)存塊在預(yù)設(shè)時(shí)間內(nèi)沒有發(fā)生變化時(shí),則說明沒有任何變量引用該對(duì)象,因而將該對(duì)象確定為垃圾資源進(jìn)行回收,從而能夠有效釋放內(nèi)存。

另外,在本步驟中,還可以進(jìn)一步通過以下方式來確定要回收的內(nèi)存塊:根據(jù)進(jìn)程內(nèi)存映像,將各個(gè)進(jìn)程中的各個(gè)對(duì)象的內(nèi)存位置記錄在第一位圖中;遍歷各個(gè)進(jìn)程所包含的全部對(duì)象,以獲取各個(gè)對(duì)象之間的引用關(guān)系,將被引用的對(duì)象的內(nèi)存位置記錄在第二位圖中;判斷第一位圖中的各個(gè)對(duì)象是否包含在第二位圖中,對(duì)未包含在第二位圖中的對(duì)象所占用的內(nèi)存塊進(jìn)行回收。具體地,第一位圖中列出了系統(tǒng)中的各個(gè)進(jìn)程的所有對(duì)象,第二位圖中列出了系統(tǒng)中被引用的對(duì)象,當(dāng)某一對(duì)象出現(xiàn)在第一位圖中而沒有出現(xiàn)在第二位圖中時(shí),說明該對(duì)象雖然存在于系統(tǒng)內(nèi)存中但是卻沒有任何引用價(jià)值,因此屬于無用的對(duì)象,其占用的內(nèi)存塊屬于該被回收的垃圾資源。

更進(jìn)一步地,在本實(shí)施例中還可以進(jìn)一步根據(jù)各個(gè)進(jìn)程中的各個(gè)對(duì)象所占用的內(nèi)存塊的動(dòng)態(tài)變化情況判斷對(duì)象的實(shí)際占用內(nèi)存塊大小與預(yù)留內(nèi)存塊大小之間的比值的增長速度是否超過預(yù)設(shè)閾值,當(dāng)判斷結(jié)果為是時(shí),針對(duì)該對(duì)象所占用的內(nèi)存塊發(fā)出報(bào)警信息。通過該方式,能夠?qū)?nèi)存占用量迅速增加的對(duì)象所占用的內(nèi)存塊確定為潛在的待回收資源,原因在于,當(dāng)一個(gè)對(duì)象所占用的內(nèi)存塊的增長速度過快時(shí),容易發(fā)生OOM問題,從而給系統(tǒng)的穩(wěn)定運(yùn)行帶來風(fēng)險(xiǎn)。

通過上述實(shí)施例,能夠根據(jù)進(jìn)程占用內(nèi)存的動(dòng)態(tài)變化情況來確定要回收的內(nèi)存資源,其結(jié)合進(jìn)程在一段時(shí)間內(nèi)的內(nèi)存占用規(guī)律來管理內(nèi)存,從而使得內(nèi)存管理效率更高。

圖4示出了本發(fā)明另一具體實(shí)施例提供的內(nèi)存管理方法的流程圖。如圖4所示,該方法包括:

步驟S410:對(duì)應(yīng)用程序的代碼段進(jìn)行分析,將其中用于執(zhí)行內(nèi)存相關(guān)操 作的函數(shù)確定為目標(biāo)函數(shù)。

其中,內(nèi)存相關(guān)操作包括:內(nèi)存的申請(qǐng)、內(nèi)存的創(chuàng)建、以及內(nèi)存的銷毀等一切與內(nèi)存相關(guān)聯(lián)的操作。為了從應(yīng)用程序的代碼段中獲取上述操作,可以預(yù)先根據(jù)各種操作所對(duì)應(yīng)的函數(shù)名稱、字段名稱等特征進(jìn)行查找。在本步驟中,將查找到的用于執(zhí)行內(nèi)存相關(guān)操作的函數(shù)確定為目標(biāo)函數(shù)。為了便于后續(xù)步驟的執(zhí)行,在本步驟中,可以對(duì)確定出的目標(biāo)函數(shù)進(jìn)行標(biāo)記。

步驟S420:向目標(biāo)函數(shù)中注入用于管理內(nèi)存狀態(tài)的掛鉤函數(shù)。

其中,掛鉤函數(shù)主要是基于Hook機(jī)制實(shí)現(xiàn)的,所謂Hook是指Windows中提供的一種用以替換DOS下“中斷”的系統(tǒng)機(jī)制,中文譯為“掛鉤”或“鉤子”。在對(duì)特定的系統(tǒng)事件進(jìn)行Hook后,一旦發(fā)生已Hook的事件,對(duì)該事件進(jìn)行Hook的程序就會(huì)收到系統(tǒng)的通知,這時(shí)程序就能在第一時(shí)間對(duì)該事件做出響應(yīng)。換言之,鉤子實(shí)際上是一個(gè)處理消息的程序段,通過系統(tǒng)調(diào)用,把它掛入系統(tǒng)。每當(dāng)特定的消息發(fā)出,在沒有到達(dá)目的窗口前,鉤子程序就先捕獲該消息,亦即鉤子函數(shù)先得到控制權(quán)。這時(shí)鉤子函數(shù)既可以加工處理(改變)該消息,也可以不作處理而繼續(xù)傳遞該消息,還可以強(qiáng)制結(jié)束消息的傳遞。

在本實(shí)施例中,通過Hook機(jī)制對(duì)目標(biāo)函數(shù)進(jìn)行Hook,根據(jù)實(shí)際需求,既可以在目標(biāo)函數(shù)的執(zhí)行入口處進(jìn)行Hook,從而在目標(biāo)函數(shù)剛剛執(zhí)行到入口處時(shí)即觸發(fā)掛鉤函數(shù)中的函數(shù)邏輯;也可以在目標(biāo)函數(shù)的中間代碼段處進(jìn)行Hook,從而在目標(biāo)函數(shù)執(zhí)行到中間的特定操作事件時(shí)觸發(fā)掛鉤函數(shù)中的函數(shù)邏輯。

優(yōu)選地,在本實(shí)施例中所執(zhí)行的掛鉤操作為內(nèi)聯(lián)掛鉤操作(inline hook)。其中,inline hook不同于以前通過修改函數(shù)的調(diào)用地址的普通hook,是直接在目標(biāo)函數(shù)的函數(shù)體內(nèi)修改指令,用一個(gè)跳轉(zhuǎn)指令實(shí)現(xiàn)掛鉤的目的,因而實(shí)現(xiàn)起來更為靈活。

步驟S430:當(dāng)目標(biāo)函數(shù)運(yùn)行至掛鉤函數(shù)所在位置時(shí),由掛鉤函數(shù)根據(jù)目標(biāo)函數(shù)對(duì)應(yīng)進(jìn)程的進(jìn)程內(nèi)存映像來確定內(nèi)存占用情況。

具體地,取決于掛鉤函數(shù)注入的位置,當(dāng)掛鉤函數(shù)的注入位置為目標(biāo)函數(shù)的執(zhí)行入口處時(shí),當(dāng)目標(biāo)函數(shù)運(yùn)行至執(zhí)行入口時(shí),則跳轉(zhuǎn)到掛鉤函數(shù)處并 執(zhí)行掛鉤函數(shù)中設(shè)定的邏輯;當(dāng)掛鉤函數(shù)的注入位置為目標(biāo)函數(shù)的中間代碼段處時(shí),當(dāng)目標(biāo)函數(shù)運(yùn)行至該代碼段處定義的特定操作事件時(shí),則跳轉(zhuǎn)到掛鉤函數(shù)處并執(zhí)行掛鉤函數(shù)中設(shè)定的邏輯。

其中,掛鉤函數(shù)中設(shè)定的邏輯通常為:獲取目標(biāo)函數(shù)對(duì)應(yīng)進(jìn)程的進(jìn)程內(nèi)存映像,進(jìn)而確定內(nèi)存占用情況。具體地,進(jìn)程內(nèi)存映像的獲取方式以及分析內(nèi)存占用情況的具體實(shí)現(xiàn)細(xì)節(jié)可參見上一實(shí)施例中相應(yīng)步驟的描述,此處不再贅述。

步驟S440:根據(jù)獲取到的內(nèi)存占用情況進(jìn)行內(nèi)存管理。

具體管理時(shí),可通過多種方式進(jìn)行管理。例如,可通過以下方式進(jìn)行管理:首先確定目標(biāo)函數(shù)對(duì)應(yīng)進(jìn)程中包含的匿名對(duì)象,其中,匿名對(duì)象包括對(duì)象數(shù)據(jù)存儲(chǔ)于堆內(nèi)存中且對(duì)象名稱未存儲(chǔ)于棧內(nèi)存中的對(duì)象;判斷匿名對(duì)象所占用的內(nèi)存塊在預(yù)設(shè)時(shí)間內(nèi)是否發(fā)生變化,當(dāng)判斷結(jié)果為否時(shí),回收該匿名對(duì)象所占用的內(nèi)存塊。

或者,也可以通過以下方式進(jìn)行管理:當(dāng)確定目標(biāo)函數(shù)對(duì)應(yīng)進(jìn)程中的對(duì)象的實(shí)際占用內(nèi)存塊大小與預(yù)留內(nèi)存塊大小之間的比值超過預(yù)設(shè)閾值時(shí),針對(duì)該對(duì)象所占用的內(nèi)存塊發(fā)出報(bào)警信息。

另外,在本步驟中,本領(lǐng)域技術(shù)人員還可以結(jié)合上一實(shí)施例中的相應(yīng)描述進(jìn)行管理,本發(fā)明對(duì)具體細(xì)節(jié)不做限定。

由此可見,在本實(shí)施例中,通過對(duì)應(yīng)用進(jìn)程的關(guān)鍵位置進(jìn)行Hook,能夠主動(dòng)跟蹤相應(yīng)內(nèi)存塊的動(dòng)態(tài)變化情況,進(jìn)而記錄內(nèi)存的申請(qǐng)、創(chuàng)建、數(shù)據(jù)以及銷毀等操作。通過上述方式,不僅能夠合理管理內(nèi)存,還能夠及時(shí)進(jìn)行預(yù)警,有效防止應(yīng)用程序的OOM問題。

本領(lǐng)域技術(shù)人員還可以對(duì)上述兩個(gè)實(shí)施例中的各個(gè)步驟進(jìn)行各種組合或變形,本發(fā)明對(duì)此不作限定。

圖5示出了本發(fā)明實(shí)施例提供的一種內(nèi)存管理裝置的結(jié)構(gòu)圖,該裝置包括:

解析模塊51,適于獲取并解析內(nèi)存信息文件,以獲得系統(tǒng)中的各個(gè)進(jìn)程在多個(gè)時(shí)間點(diǎn)所對(duì)應(yīng)的進(jìn)程內(nèi)存映像;

分析模塊52,適于根據(jù)所述進(jìn)程內(nèi)存映像確定各個(gè)進(jìn)程中的各個(gè)對(duì)象所 占用的內(nèi)存塊的動(dòng)態(tài)變化情況;

回收模塊53,適于根據(jù)所述動(dòng)態(tài)變化情況判斷各個(gè)對(duì)象所占用的內(nèi)存塊是否符合預(yù)設(shè)的回收條件,并在判斷結(jié)果為是時(shí),對(duì)符合所述回收條件的內(nèi)存塊進(jìn)行回收。

可選地,所述回收模塊53具體用于:

確定各個(gè)進(jìn)程中包含的匿名對(duì)象,其中,所述匿名對(duì)象包括對(duì)象數(shù)據(jù)存儲(chǔ)于堆內(nèi)存中且對(duì)象名稱未存儲(chǔ)于棧內(nèi)存中的對(duì)象;

判斷所述匿名對(duì)象所占用的內(nèi)存塊在預(yù)設(shè)時(shí)間內(nèi)是否發(fā)生變化,當(dāng)判斷結(jié)果為否時(shí),確定該匿名對(duì)象所占用的內(nèi)存塊符合所述回收條件。

可選地,所述回收模塊53進(jìn)一步用于:

根據(jù)所述進(jìn)程內(nèi)存映像,將各個(gè)進(jìn)程中的各個(gè)對(duì)象的內(nèi)存位置記錄在第一位圖中;

遍歷各個(gè)進(jìn)程所包含的全部對(duì)象,以獲取各個(gè)對(duì)象之間的引用關(guān)系,將被引用的對(duì)象的內(nèi)存位置記錄在第二位圖中;

判斷所述第一位圖中的各個(gè)對(duì)象是否包含在所述第二位圖中,對(duì)未包含在所述第二位圖中的對(duì)象所占用的內(nèi)存塊進(jìn)行回收。

可選地,該裝置進(jìn)一步包括:報(bào)警模塊,適于根據(jù)所述動(dòng)態(tài)變化情況判斷對(duì)象的實(shí)際占用內(nèi)存塊大小與預(yù)留內(nèi)存塊大小之間的比值的增長速度是否超過預(yù)設(shè)閾值,當(dāng)判斷結(jié)果為是時(shí),針對(duì)該對(duì)象所占用的內(nèi)存塊發(fā)出報(bào)警信息。

其中,所述內(nèi)存信息文件為安卓系統(tǒng)提供的虛擬文件,或者,所述內(nèi)存信息文件為預(yù)先創(chuàng)建的系統(tǒng)內(nèi)存檢查文件。

上述各個(gè)模塊的具體工作原理可參見方法實(shí)施例中相應(yīng)步驟的描述,此處不再贅述。

在本發(fā)明提供的內(nèi)存管理的方法及裝置中,通過解析內(nèi)存信息文件來獲得系統(tǒng)中的各個(gè)進(jìn)程在多個(gè)時(shí)間點(diǎn)所對(duì)應(yīng)的進(jìn)程內(nèi)存映像,從而根據(jù)進(jìn)程內(nèi)存映像確定各個(gè)進(jìn)程中的各個(gè)對(duì)象所占用的內(nèi)存塊的動(dòng)態(tài)變化情況,根據(jù)動(dòng)態(tài)變化情況判斷各個(gè)對(duì)象所占用的內(nèi)存塊是否符合預(yù)設(shè)的回收條件。由于本 發(fā)明中能夠獲取各個(gè)進(jìn)程在連續(xù)的一段時(shí)間內(nèi)的多個(gè)時(shí)間點(diǎn)(而非一個(gè)時(shí)間點(diǎn))所對(duì)應(yīng)的進(jìn)程內(nèi)存映像,從而能夠確定內(nèi)存占用情況的動(dòng)態(tài)變化規(guī)律,進(jìn)而根據(jù)該動(dòng)態(tài)變化規(guī)律進(jìn)行內(nèi)存管理,使得內(nèi)存資源得到更加合理的利用。

在此提供的算法和顯示不與任何特定計(jì)算機(jī)、虛擬系統(tǒng)或者其它設(shè)備固有相關(guān)。各種通用系統(tǒng)也可以與基于在此的示教一起使用。根據(jù)上面的描述,構(gòu)造這類系統(tǒng)所要求的結(jié)構(gòu)是顯而易見的。此外,本發(fā)明也不針對(duì)任何特定編程語言。應(yīng)當(dāng)明白,可以利用各種編程語言實(shí)現(xiàn)在此描述的本發(fā)明的內(nèi)容,并且上面對(duì)特定語言所做的描述是為了披露本發(fā)明的最佳實(shí)施方式。

在此處所提供的說明書中,說明了大量具體細(xì)節(jié)。然而,能夠理解,本發(fā)明的實(shí)施例可以在沒有這些具體細(xì)節(jié)的情況下實(shí)踐。在一些實(shí)例中,并未詳細(xì)示出公知的方法、結(jié)構(gòu)和技術(shù),以便不模糊對(duì)本說明書的理解。

類似地,應(yīng)當(dāng)理解,為了精簡本公開并幫助理解各個(gè)發(fā)明方面中的一個(gè)或多個(gè),在上面對(duì)本發(fā)明的示例性實(shí)施例的描述中,本發(fā)明的各個(gè)特征有時(shí)被一起分組到單個(gè)實(shí)施例、圖、或者對(duì)其的描述中。然而,并不應(yīng)將該公開的方法解釋成反映如下意圖:即所要求保護(hù)的本發(fā)明要求比在每個(gè)權(quán)利要求中所明確記載的特征更多的特征。更確切地說,如下面的權(quán)利要求書所反映的那樣,發(fā)明方面在于少于前面公開的單個(gè)實(shí)施例的所有特征。因此,遵循具體實(shí)施方式的權(quán)利要求書由此明確地并入該具體實(shí)施方式,其中每個(gè)權(quán)利要求本身都作為本發(fā)明的單獨(dú)實(shí)施例。

本領(lǐng)域那些技術(shù)人員可以理解,可以對(duì)實(shí)施例中的設(shè)備中的模塊進(jìn)行自適應(yīng)性地改變并且把它們?cè)O(shè)置在與該實(shí)施例不同的一個(gè)或多個(gè)設(shè)備中??梢园褜?shí)施例中的模塊或單元或組件組合成一個(gè)模塊或單元或組件,以及此外可以把它們分成多個(gè)子模塊或子單元或子組件。除了這樣的特征和/或過程或者單元中的至少一些是相互排斥之外,可以采用任何組合對(duì)本說明書(包括伴隨的權(quán)利要求、摘要和附圖)中公開的所有特征以及如此公開的任何方法或者設(shè)備的所有過程或單元進(jìn)行組合。除非另外明確陳述,本說明書(包括伴隨的權(quán)利要求、摘要和附圖)中公開的每個(gè)特征可以由提供相同、等同或相似目的的替代特征來代替。

此外,本領(lǐng)域的技術(shù)人員能夠理解,盡管在此的一些實(shí)施例包括其它實(shí)施例中所包括的某些特征而不是其它特征,但是不同實(shí)施例的特征的組合意 味著處于本發(fā)明的范圍之內(nèi)并且形成不同的實(shí)施例。例如,在下面的權(quán)利要求書中,所要求保護(hù)的實(shí)施例的任意之一都可以以任意的組合方式來使用。

本發(fā)明的各個(gè)部件實(shí)施例可以以硬件實(shí)現(xiàn),或者以在一個(gè)或者多個(gè)處理器上運(yùn)行的軟件模塊實(shí)現(xiàn),或者以它們的組合實(shí)現(xiàn)。本領(lǐng)域的技術(shù)人員應(yīng)當(dāng)理解,可以在實(shí)踐中使用微處理器或者數(shù)字信號(hào)處理器(DSP)來實(shí)現(xiàn)根據(jù)本發(fā)明實(shí)施例的裝置中的一些或者全部部件的一些或者全部功能。本發(fā)明還可以實(shí)現(xiàn)為用于執(zhí)行這里所描述的方法的一部分或者全部的設(shè)備或者裝置程序(例如,計(jì)算機(jī)程序和計(jì)算機(jī)程序產(chǎn)品)。這樣的實(shí)現(xiàn)本發(fā)明的程序可以存儲(chǔ)在計(jì)算機(jī)可讀介質(zhì)上,或者可以具有一個(gè)或者多個(gè)信號(hào)的形式。這樣的信號(hào)可以從因特網(wǎng)網(wǎng)站上下載得到,或者在載體信號(hào)上提供,或者以任何其他形式提供。

應(yīng)該注意的是上述實(shí)施例對(duì)本發(fā)明進(jìn)行說明而不是對(duì)本發(fā)明進(jìn)行限制,并且本領(lǐng)域技術(shù)人員在不脫離所附權(quán)利要求的范圍的情況下可設(shè)計(jì)出替換實(shí)施例。在權(quán)利要求中,不應(yīng)將位于括號(hào)之間的任何參考符號(hào)構(gòu)造成對(duì)權(quán)利要求的限制。單詞“包含”不排除存在未列在權(quán)利要求中的元件或步驟。位于元件之前的單詞“一”或“一個(gè)”不排除存在多個(gè)這樣的元件。本發(fā)明可以借助于包括有若干不同元件的硬件以及借助于適當(dāng)編程的計(jì)算機(jī)來實(shí)現(xiàn)。在列舉了若干裝置的單元權(quán)利要求中,這些裝置中的若干個(gè)可以是通過同一個(gè)硬件項(xiàng)來具體體現(xiàn)。單詞第一、第二、以及第三等的使用不表示任何順序??蓪⑦@些單詞解釋為名稱。

當(dāng)前第1頁1 2 3 
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1