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

內(nèi)存檢測(cè)方法、裝置及電子設(shè)備與流程

文檔序號(hào):11432161閱讀:172來(lái)源:國(guó)知局
內(nèi)存檢測(cè)方法、裝置及電子設(shè)備與流程

本申請(qǐng)涉及計(jì)算機(jī)技術(shù)領(lǐng)域,尤其涉及一種內(nèi)存檢測(cè)方法、裝置及電子設(shè)備。



背景技術(shù):

在應(yīng)用程序?qū)嶋H的運(yùn)行過程中,導(dǎo)致內(nèi)存溢出的因素很多,例如,技術(shù)人員由于疏忽或錯(cuò)誤造成應(yīng)用程序未能釋放已經(jīng)不再使用的內(nèi)存,可能會(huì)出現(xiàn)內(nèi)存泄漏,而內(nèi)存泄漏會(huì)導(dǎo)致內(nèi)存溢出。對(duì)于應(yīng)用程序已經(jīng)發(fā)布上線的情形,線上環(huán)境出現(xiàn)的內(nèi)存溢出問題通常由于線上環(huán)境復(fù)雜,技術(shù)人員難以通過線下復(fù)現(xiàn)的方式排查線上環(huán)境導(dǎo)致內(nèi)存溢出的原因。



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

有鑒于此,本申請(qǐng)?zhí)峁┮环N新的技術(shù)方案,可以利用電子設(shè)備有限的內(nèi)存資源對(duì)應(yīng)用程序出現(xiàn)內(nèi)存泄漏的問題進(jìn)行實(shí)時(shí)分析。

為實(shí)現(xiàn)上述目的,本申請(qǐng)?zhí)峁┘夹g(shù)方案如下:

根據(jù)本申請(qǐng)的第一方面,提出了一種內(nèi)存檢測(cè)方法,包括:

當(dāng)監(jiān)測(cè)到應(yīng)用程序在運(yùn)行過程中占用的內(nèi)存需要檢測(cè)時(shí),確定與所述應(yīng)用程序相關(guān)的第一實(shí)例集合;

基于所述第一實(shí)例集合中每一個(gè)實(shí)例占用的內(nèi)存值,從所述第一實(shí)例集合中確定用于分析所述應(yīng)用程序出現(xiàn)內(nèi)存泄漏的第二實(shí)例集合;

基于所述第二實(shí)例集合中每一個(gè)實(shí)例的路徑信息,生成關(guān)于所述應(yīng)用程序出現(xiàn)內(nèi)存泄漏的檢測(cè)結(jié)果。

根據(jù)本申請(qǐng)的第二方面,提出了一種內(nèi)存檢測(cè)裝置,包括:

第一確定單元,用于當(dāng)監(jiān)測(cè)到應(yīng)用程序在運(yùn)行過程中占用的內(nèi)存需要檢測(cè)時(shí),確定與所述應(yīng)用程序相關(guān)的第一實(shí)例集合;

第二確定單元,用于基于所述第一確定單元確定的所述第一實(shí)例集合中每一個(gè)實(shí)例占用的內(nèi)存值,從所述第一實(shí)例集合中確定用于分析所述應(yīng)用程序出現(xiàn)內(nèi)存泄漏的第二實(shí)例集合;

檢測(cè)結(jié)果生成單元,用于基于所述第二確定單元確定的所述第二實(shí)例集合中每一個(gè)實(shí)例的路徑信息,生成關(guān)于所述應(yīng)用程序出現(xiàn)內(nèi)存泄漏的檢測(cè)結(jié)果。

根據(jù)本申請(qǐng)的第三方面,提出了一種計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),所述存儲(chǔ)介質(zhì)存儲(chǔ)有計(jì)算機(jī)程序,所述計(jì)算機(jī)程序用于執(zhí)行上述第一方面提出的內(nèi)存檢測(cè)方法。

根據(jù)本申請(qǐng)的第四方面,提出了一種電子設(shè)備,所述電子設(shè)備包括:存儲(chǔ)器、處理器及存儲(chǔ)在存儲(chǔ)器上并可在處理器上運(yùn)行的計(jì)算機(jī)程序,所述處理器執(zhí)行所述程序時(shí)實(shí)現(xiàn)上述第一方面提供的內(nèi)存檢測(cè)方法。

由以上技術(shù)方案可見,由于第二實(shí)例集合中包含的實(shí)例的數(shù)量遠(yuǎn)遠(yuǎn)小于堆內(nèi)存中的實(shí)例的數(shù)量,因此可以確保在復(fù)雜的線上環(huán)境中,利用電子設(shè)備有限的內(nèi)存資源,通過第二實(shí)例集合中的每一個(gè)實(shí)例的路徑信息對(duì)應(yīng)用程序出現(xiàn)內(nèi)存泄漏的問題進(jìn)行實(shí)時(shí)分析,便于查找造成應(yīng)用程序出現(xiàn)內(nèi)存溢出的原因,使測(cè)試人員根據(jù)檢測(cè)結(jié)果快速定位出現(xiàn)內(nèi)存溢出的位置,進(jìn)而可改進(jìn)出現(xiàn)內(nèi)存溢出的代碼,提高應(yīng)用程序的穩(wěn)定性。

附圖說明

圖1是本申請(qǐng)一示例性實(shí)施例示出的內(nèi)存檢測(cè)方法的流程示意圖;

圖2是本申請(qǐng)另一示例性實(shí)施例示出的內(nèi)存檢測(cè)方法的流程示意圖;

圖3a是本申請(qǐng)?jiān)僖皇纠詫?shí)施例示出的內(nèi)存檢測(cè)方法的流程示意圖;

圖3b是圖3a所示實(shí)施例中的實(shí)例的路徑示意圖;

圖3c是經(jīng)過圖3a所示實(shí)施例合并實(shí)例之后的示意圖;

圖4a是本申請(qǐng)?jiān)僖皇纠詫?shí)施例示出的內(nèi)存檢測(cè)方法的流程示意圖;

圖4b是圖4a所示實(shí)施例中的第二實(shí)例集合的示意圖;

圖4c是圖4a所示實(shí)施例中對(duì)第二實(shí)例集合進(jìn)行擴(kuò)容的示意圖;

圖4d是圖4a所示實(shí)施例中對(duì)第二實(shí)例集合進(jìn)行置換的示意圖;

圖5a是本申請(qǐng)又一示例性實(shí)施例示出的內(nèi)存檢測(cè)方法的流程示意圖;

圖5b是圖5a所示實(shí)施例中應(yīng)用程序在運(yùn)行過程中的內(nèi)存值的示意圖;

圖5c是圖5a所示實(shí)施例中的波谷點(diǎn)的示意圖;

圖6是本申請(qǐng)一示例性實(shí)施例示出的內(nèi)存檢測(cè)裝置的結(jié)構(gòu)示意圖;

圖7是本申請(qǐng)另一示例性實(shí)施例示出的內(nèi)存檢測(cè)裝置的結(jié)構(gòu)示意圖;

圖8是本申請(qǐng)一示例性實(shí)施例示出的電子設(shè)備的結(jié)構(gòu)示意圖。

具體實(shí)施方式

這里將詳細(xì)地對(duì)示例性實(shí)施例進(jìn)行說明,其示例表示在附圖中。下面的描述涉及附圖時(shí),除非另有表示,不同附圖中的相同數(shù)字表示相同或相似的要素。以下示例性實(shí)施例中所描述的實(shí)施方式并不代表與本申請(qǐng)相一致的所有實(shí)施方式。相反,它們僅是與如所附權(quán)利要求書中所詳述的、本申請(qǐng)的一些方面相一致的裝置和方法的例子。

在本申請(qǐng)使用的術(shù)語(yǔ)是僅僅出于描述特定實(shí)施例的目的,而非旨在限制本申請(qǐng)。在本申請(qǐng)和所附權(quán)利要求書中所使用的單數(shù)形式的“一種”、“所述”和“該”也旨在包括多數(shù)形式,除非上下文清楚地表示其他含義。還應(yīng)當(dāng)理解,本文中使用的術(shù)語(yǔ)“和/或”是指并包含一個(gè)或多個(gè)相關(guān)聯(lián)的列出項(xiàng)目的任何或所有可能組合。

應(yīng)當(dāng)理解,盡管在本申請(qǐng)可能采用術(shù)語(yǔ)第一、第二、第三等來(lái)描述各種信息,但這些信息不應(yīng)限于這些術(shù)語(yǔ)。這些術(shù)語(yǔ)僅用來(lái)將同一類型的信息彼此區(qū)分開。例如,在不脫離本申請(qǐng)范圍的情況下,第一信息也可以被稱為第二信息,類似地,第二信息也可以被稱為第一信息。取決于語(yǔ)境,如在此所使用的詞語(yǔ)“如果”可以被解釋成為“在……時(shí)”或“當(dāng)……時(shí)”或“響應(yīng)于確定”。

本申請(qǐng)涉及到的基礎(chǔ)定義:

實(shí)例:是根據(jù)類創(chuàng)建出來(lái)的一個(gè)個(gè)具體的“對(duì)象”。

實(shí)例屬性:包括實(shí)例自身的信息以及與實(shí)例相關(guān)的信息,實(shí)例自身的信息可包括:實(shí)例的名稱、實(shí)例本身大小(shallowsize)、實(shí)例被回收可釋放的總內(nèi)存大小(retainsize)、用于查找泄漏路徑信息(mhardreferences)等,與實(shí)例相關(guān)的信息可包括:實(shí)例的直接掌控者(mimmediatedominator)的信息,也可以理解為父實(shí)例的信息,例如,父實(shí)例的名稱、序列號(hào)(id)以及大小等。

內(nèi)存泄露:也稱作“存儲(chǔ)滲漏”,用動(dòng)態(tài)存儲(chǔ)分配函數(shù)動(dòng)態(tài)開辟的內(nèi)存空間,在該內(nèi)存空間使用完畢后未釋放而一直被占據(jù),直到程序結(jié)束。

內(nèi)存溢出:指程序在申請(qǐng)內(nèi)存時(shí),沒有足夠的內(nèi)存空間供其使用。

圖1是本申請(qǐng)一示例性實(shí)施例示出的內(nèi)存檢測(cè)方法的流程示意圖;本申請(qǐng)可以應(yīng)用在電子設(shè)備上,通過開發(fā)第三方程序或者第三方庫(kù)的方式實(shí)現(xiàn),當(dāng)應(yīng)用程序接入到該第三方程序或者第三方庫(kù)時(shí),通過第三方程序或者第三方庫(kù)檢測(cè)應(yīng)用程序在運(yùn)行過程中占用的內(nèi)存,如圖1所示,包括如下步驟:

步驟101,當(dāng)監(jiān)測(cè)到應(yīng)用程序在運(yùn)行過程中占用的內(nèi)存需要檢測(cè)時(shí),確定與應(yīng)用程序相關(guān)的第一實(shí)例集合。

在一實(shí)施例中,可通過應(yīng)用程序的內(nèi)存的快照文件獲取與應(yīng)用程序相關(guān)的第一實(shí)例集合,例如,在應(yīng)用程序運(yùn)行過程中,通過dump命令生成hprof文件,解析hprof文件得到快照文件,從快照文件中確定與應(yīng)用程序相關(guān)的堆內(nèi)存(heap)。在堆內(nèi)存中包括與該應(yīng)用程序相關(guān)的大量實(shí)例,每個(gè)實(shí)例具有實(shí)例名稱、本身大小(shallowsize)和被回收可釋放的總內(nèi)存大小(retainsize)等屬性。

進(jìn)一步地,在解析hprof文件的過程中,可存儲(chǔ)已解析的實(shí)例以及記錄已解析的實(shí)例的名稱以及實(shí)例本身大小,將當(dāng)前正在解析的實(shí)例的名稱與已存儲(chǔ)的實(shí)例的實(shí)例名稱以及實(shí)例本身大小進(jìn)行比較,若已存儲(chǔ)的具有相同實(shí)例名稱并且具有相同本身大小的實(shí)例的數(shù)量等于第一預(yù)設(shè)閾值,可以在后續(xù)解析過程中將與該實(shí)例名稱相同并且具有相同本身大小的實(shí)例丟棄,從而可以將相同名稱并且具有相同本身大小的實(shí)例的數(shù)量控制在第一預(yù)設(shè)閾值以內(nèi),確保本申請(qǐng)?jiān)跈z測(cè)內(nèi)存泄漏時(shí)占用較少的內(nèi)存。

步驟102,基于第一實(shí)例集合中每一個(gè)實(shí)例占用的內(nèi)存值,從第一實(shí)例集合中確定用于分析應(yīng)用程序出現(xiàn)內(nèi)存泄漏的第二實(shí)例集合。

與上述步驟101的描述相對(duì)應(yīng),在步驟102中,可以先統(tǒng)計(jì)第一實(shí)例集合中的具有相同實(shí)例名稱并且具有相同大小的實(shí)例,得到多個(gè)實(shí)例組,其中,多個(gè)實(shí)例組中的每一個(gè)實(shí)例組包括至少一個(gè)實(shí)例;對(duì)每一個(gè)實(shí)例組中的實(shí)例的內(nèi)存值進(jìn)行加和,得到多個(gè)實(shí)例組各自對(duì)應(yīng)的內(nèi)存和值;基于多個(gè)實(shí)例組各自對(duì)應(yīng)的內(nèi)存和值,對(duì)實(shí)例組按照預(yù)設(shè)順序進(jìn)行排序;基于內(nèi)存和值由大到小的順序,確定排在前設(shè)定位數(shù)的實(shí)例組,排在前設(shè)定位數(shù)的實(shí)例組形成用于分析應(yīng)用程序出現(xiàn)內(nèi)存泄漏的第二實(shí)例集合。在一實(shí)施例中,每一個(gè)實(shí)例組中可以包括多個(gè)具有相同實(shí)例名稱并且大小相同的實(shí)例,例如,實(shí)例“abc1”和實(shí)例“abc2”為實(shí)例名稱相同并且大小相同,則可以為被統(tǒng)計(jì)到一個(gè)實(shí)例組中;實(shí)例“abc3”和實(shí)例“abc4”為實(shí)例名稱相同并且大小相同,實(shí)例“abc1”與實(shí)例“abc3”為實(shí)例名稱相同但大小不相同,則實(shí)例“abc3”和實(shí)例“abc4”可被統(tǒng)計(jì)到另一個(gè)實(shí)例組中;實(shí)例“abc1”和實(shí)例“bcd2”為名稱不同的實(shí)例,則可以需要被統(tǒng)計(jì)不同的實(shí)例組中。

在一實(shí)施例中,每一個(gè)實(shí)例組中的實(shí)例的內(nèi)存值可以為實(shí)例被回收可釋放的總內(nèi)存大小(retainsize)。

在一實(shí)施例中,可以基于第一實(shí)例集合中每一個(gè)實(shí)例占用的內(nèi)存值大小,通過堆排序法、快速排序法、冒泡排序法等,將第一實(shí)例集合中的實(shí)例按照占用的內(nèi)存值以預(yù)設(shè)順序(例如,由大到小或者由小到大)排序,例如,當(dāng)由大到小排序時(shí),從第二實(shí)例集合中確定出大小排在前設(shè)定位數(shù)的實(shí)例,該排在前設(shè)定位數(shù)的實(shí)例可視為本申請(qǐng)中的第二實(shí)例集合,當(dāng)由小到大排序時(shí),從第二實(shí)例集合中確定出大小排在后設(shè)定位數(shù)的實(shí)例,該排在后設(shè)定位數(shù)的實(shí)例可視為本申請(qǐng)中的第二實(shí)例集合。

步驟103,基于第二實(shí)例集合中每一個(gè)實(shí)例的路徑信息,生成關(guān)于應(yīng)用程序出現(xiàn)內(nèi)存泄漏的檢測(cè)結(jié)果。

在一實(shí)施例中,路徑信息表示每一個(gè)實(shí)例到垃圾回收器中的根對(duì)象(gcroot)所經(jīng)過的所有父實(shí)例的信息,父實(shí)例的信息可包括父實(shí)例的名稱、父實(shí)例被回收可釋放的總內(nèi)存大小(retainsize)等,其中一個(gè)實(shí)例的路徑信息例如:

*gcrootthreadjava.lang.thread.<javalocal>(named'threadnamenotavailable')

*referencesjava.util.arraylist.array

*referencesarrayjava.lang.object[].[0]

*leakscom.amap.api.col.aj$a。

本領(lǐng)域技術(shù)人員可以理解的是,同一個(gè)應(yīng)用程序中可包含多個(gè)根對(duì)象(gcroot),因此不同的實(shí)例可能對(duì)應(yīng)不同的根對(duì)象。

現(xiàn)舉例說明本實(shí)施例:例如,當(dāng)監(jiān)測(cè)到應(yīng)用程序在運(yùn)行過程中占用的內(nèi)存需要檢測(cè)時(shí),若通過dump命令生成的hprof文件中包含有20萬(wàn)個(gè)實(shí)例,通過步驟101的描述可以從這20萬(wàn)個(gè)實(shí)例中,統(tǒng)計(jì)出具有相同名稱以及相同本身大小的實(shí)例,并控制具有相同名稱以及相同本身大小的實(shí)例的數(shù)量小于或者等于第一預(yù)設(shè)閾值,從而可以使第一實(shí)例集合中包含的實(shí)例的數(shù)量遠(yuǎn)遠(yuǎn)小于hprof文件中包含的實(shí)例的數(shù)量,例如,從這20萬(wàn)個(gè)實(shí)例中通過步驟101的描述得到5萬(wàn)個(gè)實(shí)例,則該5萬(wàn)個(gè)實(shí)例形成的集合即可視為本申請(qǐng)所述的第一實(shí)例集合。通過上述步驟202的描述可對(duì)這5萬(wàn)個(gè)實(shí)例進(jìn)行分組,得到多個(gè)實(shí)例組(例如,500個(gè)實(shí)例組)。對(duì)這500個(gè)實(shí)例組中的每一個(gè)實(shí)例組的實(shí)例的內(nèi)存值進(jìn)行加和,得到每一個(gè)實(shí)例組對(duì)應(yīng)的內(nèi)存和值,例如,共有500個(gè)內(nèi)存和值,通過對(duì)這500個(gè)內(nèi)存和值進(jìn)行由大到小的順序排序,得到排在前100的實(shí)例組,則這100個(gè)實(shí)例組可視為本申請(qǐng)中的第二實(shí)例集合?;谶@100個(gè)實(shí)例組中的每一個(gè)實(shí)例的路徑信息,可生成關(guān)于應(yīng)用程序出現(xiàn)內(nèi)存泄漏的檢測(cè)結(jié)果。

對(duì)于第二實(shí)例集合中的每一個(gè)實(shí)例的路徑信息,組成檢測(cè)結(jié)果。此外,檢測(cè)結(jié)果可以通過文本的方式上報(bào)給服務(wù)器,還可以在電子設(shè)備本地通過文本的方式展示給用戶。

本實(shí)施例通過上述步驟101-步驟103,由于第二實(shí)例集合中包含的實(shí)例的數(shù)量遠(yuǎn)遠(yuǎn)小于堆內(nèi)存中的實(shí)例的數(shù)量,因此可以確保在復(fù)雜的線上環(huán)境中,利用電子設(shè)備有限的內(nèi)存資源,通過第二實(shí)例集合中的每一個(gè)實(shí)例的路徑信息對(duì)應(yīng)用程序出現(xiàn)內(nèi)存泄漏的問題進(jìn)行實(shí)時(shí)分析,便于查找造成應(yīng)用程序出現(xiàn)內(nèi)存泄漏的原因,使測(cè)試人員根據(jù)檢測(cè)結(jié)果快速定位出現(xiàn)內(nèi)存泄漏的位置,進(jìn)而可改進(jìn)出現(xiàn)內(nèi)存泄漏的代碼,提高應(yīng)用程序的穩(wěn)定性。

圖2是本申請(qǐng)另一示例性實(shí)施例示出的內(nèi)存檢測(cè)方法的流程示意圖;本實(shí)施例在上述實(shí)施例的基礎(chǔ)上,以如何確定與應(yīng)用程序相關(guān)的第一實(shí)例集合為例進(jìn)行示例性說明,如圖2所示,包括如下步驟:

步驟201,當(dāng)監(jiān)測(cè)到應(yīng)用程序在運(yùn)行過程中占用的內(nèi)存需要檢測(cè)時(shí),確定用于記錄應(yīng)用程序的內(nèi)存信息的內(nèi)存鏡像文件。

在一實(shí)施例中,可以通過dump命令拷貝應(yīng)用程序當(dāng)前占用的內(nèi)存信息,生成hprof文件,該hprof文件可視為本申請(qǐng)中的內(nèi)存鏡像文件。

步驟202,在解析內(nèi)存鏡像文件的過程中,確定第一實(shí)例集合中已記錄的與當(dāng)前正在解析的具有相同實(shí)例名稱并且具有相同本身大小的實(shí)例的數(shù)量。

在一實(shí)施例中,名稱相同的實(shí)例,由于序列號(hào)(id)不同,可表示不同的實(shí)例,例如,實(shí)例abc1與實(shí)例abc2,其中,“abc”可視為實(shí)例的名稱,“1”和“2”可視為實(shí)例的序列號(hào)。例如,堆內(nèi)存中有與應(yīng)用程序相關(guān)的10萬(wàn)個(gè)實(shí)例,可以根據(jù)實(shí)例名稱以及實(shí)例本身大小統(tǒng)計(jì)這10萬(wàn)個(gè)實(shí)例,找到具有相同名稱并且具有相同本身大小的實(shí)例,控制具有相同名稱并且具有相同本身大小的實(shí)例的數(shù)量在第一預(yù)設(shè)閾值以內(nèi)。

步驟203,確定具有相同名稱并且具有相同本身大小的實(shí)例的數(shù)量與第一預(yù)設(shè)閾值的大小關(guān)系,若實(shí)例的數(shù)量小于第一預(yù)設(shè)閾值,執(zhí)行步驟204,若實(shí)例的數(shù)量等于第一預(yù)設(shè)閾值,執(zhí)行步驟205。

在一實(shí)施例中,第一預(yù)設(shè)閾值的大小可以為萬(wàn)級(jí)以上,具體的數(shù)值可以根據(jù)具體應(yīng)用程序的大小來(lái)確定,本申請(qǐng)對(duì)第一預(yù)設(shè)閾值的具體值不做限定。

步驟204,若實(shí)例的數(shù)量小于第一預(yù)設(shè)閾值,將當(dāng)前正在解析的實(shí)例記錄在第一實(shí)例集合中,以及,更新與當(dāng)前正在解析的實(shí)例具有相同實(shí)例名稱并且具有相同本身大小的實(shí)例的數(shù)量。

例如,第一預(yù)設(shè)閾值為1萬(wàn),當(dāng)前正在解析的實(shí)例為“abc10”,其中,“abc”為實(shí)例名稱,“10”為實(shí)例的序列號(hào)(id),若第一實(shí)例集合中已經(jīng)記錄的實(shí)例名稱為“abc”并且具有相同本身大小的實(shí)例的總數(shù)量為9990,則可以將實(shí)例“abc10”記錄在第一實(shí)例集合中,并將第一實(shí)例集合中的具有實(shí)例名稱為“abc”的實(shí)例的數(shù)量更新為9991。

步驟205,若實(shí)例的數(shù)量等于第一預(yù)設(shè)閾值,將當(dāng)前正在解析的實(shí)例記錄在第三實(shí)例集合。

與上述步驟204相對(duì)應(yīng),若第一實(shí)例集合中已經(jīng)記錄的實(shí)例名稱為“abc”并且具有相同本身大小的實(shí)例的總數(shù)量為1萬(wàn)個(gè),則可以將實(shí)例“abc10”記錄在第三實(shí)例集合中,從而將第一實(shí)例集合關(guān)于實(shí)例名稱為“abc”并具有相同本身大小的實(shí)例的數(shù)量控制在1萬(wàn)個(gè)以內(nèi)。

本實(shí)施例中,通過將第一實(shí)例集合中具有相同實(shí)例名稱并且具有相同大小的實(shí)例的數(shù)量控制在第一預(yù)設(shè)閾值,可以控制本申請(qǐng)?jiān)诜治鰬?yīng)用程序的進(jìn)程在內(nèi)存中的占用比例,從而確保本申請(qǐng)能夠在應(yīng)用程序運(yùn)行過程中分析應(yīng)用程序的內(nèi)存泄漏,降低由于分析內(nèi)存泄漏所消耗的內(nèi)存資源。

圖3a是本申請(qǐng)?jiān)僖皇纠詫?shí)施例示出的內(nèi)存檢測(cè)方法的流程示意圖,圖3b是圖3a所示實(shí)施例中的實(shí)例的路徑示意圖,圖3c是經(jīng)過圖3a所示實(shí)施例合并實(shí)例之后的示意圖;本實(shí)施例在上述實(shí)施例的基礎(chǔ)上,以如何調(diào)整第二實(shí)例集合為例進(jìn)行示例性說明,如圖3a所示,包括如下步驟:

步驟301,根據(jù)實(shí)例名稱、該實(shí)例對(duì)應(yīng)的父實(shí)例的名稱,對(duì)與應(yīng)用程序相關(guān)的并且未記錄在第二實(shí)例集合中的實(shí)例進(jìn)行路徑合并。

在一實(shí)施例中,與應(yīng)用程序相關(guān)的并且未記錄在第二實(shí)例集合中的實(shí)例,既可以包括在上述圖1所示實(shí)施例中與應(yīng)用程序相關(guān)的堆內(nèi)存中的大量實(shí)例中未記錄在第一實(shí)例集合中的實(shí)例,也可以包括上述圖2所示實(shí)施例中的第三實(shí)例集合中的實(shí)例。

步驟302,當(dāng)合并后的實(shí)例的內(nèi)存值符合預(yù)設(shè)條件時(shí),將合并后的實(shí)例添加到第二實(shí)例集合中。

應(yīng)用程序在運(yùn)行過程中可能是由于不斷進(jìn)入新界面,退出該新界面,再進(jìn)入該新界面,再退出該新界面等反復(fù)操作造成小對(duì)象導(dǎo)致內(nèi)存泄露,這些小對(duì)象在堆內(nèi)存中通過快照解析后成為不同的實(shí)例,并且這些小對(duì)象自身不會(huì)占用太大的內(nèi)存,并分屬于不同的垃圾回收器(gc)路徑(也可稱為鏈路),其中,gcroot表示內(nèi)存中不可以被回收的實(shí)例,例如,若整條路徑上的根節(jié)點(diǎn)為垃圾回收器的根對(duì)象,則該條路徑在內(nèi)存使用過程中無(wú)法被回收。

如圖3b所示,由于反復(fù)操作實(shí)例b1、實(shí)例b2、實(shí)例b3造成了內(nèi)存泄漏,而泄漏的路徑互不相同,例如,對(duì)于實(shí)例b1而言,到垃圾回收器的根對(duì)象(gcroots)的路徑為b1-a1-根對(duì)象,對(duì)于實(shí)例b2而言,到垃圾回收器的根對(duì)象(gcroots)的路徑為b2-a2-根對(duì)象,對(duì)于實(shí)例b3而言,到垃圾回收器的根對(duì)象(gcroots)的路徑為b3-a3-根對(duì)象。實(shí)例b1、實(shí)例b2、實(shí)例b3通過不同的路徑,匯聚到相同的祖輩節(jié)點(diǎn)(gcroots),因此可以將這三個(gè)小實(shí)例合并,也即,將同一級(jí)的實(shí)例合并為一個(gè)實(shí)例,合并后的實(shí)例如圖3c所示,在合并同一級(jí)節(jié)點(diǎn)的實(shí)例的過程中,需要將同一級(jí)節(jié)點(diǎn)的實(shí)例的內(nèi)存值(可以為實(shí)例被回收可釋放的總內(nèi)存大小(retainsize))進(jìn)行加和,由此可提高該條路徑上的實(shí)例的內(nèi)存值所占的比重。

在一實(shí)施例中,預(yù)設(shè)條件的具體描述可以參見下述圖4a所示實(shí)施例的相關(guān)描述,在此先不詳述。

本實(shí)施例中,通過將排在前設(shè)定位數(shù)的合并后的實(shí)例記錄在第二實(shí)例集合中,從而可確保由小對(duì)象導(dǎo)致的內(nèi)存泄漏被及時(shí)查找到。

圖4a是本申請(qǐng)?jiān)僖皇纠詫?shí)施例示出的內(nèi)存檢測(cè)方法的流程示意圖,圖4b是圖4a所示實(shí)施例中的第二實(shí)例集合的示意圖,圖4c是圖4a所示實(shí)施例中對(duì)第二實(shí)例集合進(jìn)行擴(kuò)容的示意圖,圖4d是圖4a所示實(shí)施例中對(duì)第二實(shí)例集合進(jìn)行置換的示意圖;本實(shí)施例在上述實(shí)施例的基礎(chǔ)上,以如何調(diào)整第二實(shí)例集合為例進(jìn)行示例性說明,如圖4a所示,包括如下步驟:

步驟401,將與應(yīng)用程序相關(guān)的并且未記錄在第二實(shí)例集合中的每一個(gè)實(shí)例的內(nèi)存值與第二預(yù)設(shè)閾值進(jìn)行比較,若內(nèi)存值大于第二預(yù)設(shè)閾值,執(zhí)行步驟402,若內(nèi)存值小于第二預(yù)設(shè)閾值,執(zhí)行步驟403。

步驟402,將內(nèi)存值大于第二預(yù)設(shè)閾值的實(shí)例添加到第二實(shí)例集合中,執(zhí)行圖1所示實(shí)施例中的步驟403,流程結(jié)束。

步驟403,對(duì)與應(yīng)用程序相關(guān)的并且未記錄在第二實(shí)例集合中的內(nèi)存值小于第二預(yù)設(shè)閾值的實(shí)例,將小于第二預(yù)設(shè)閾值的內(nèi)存值與第二實(shí)例集合中實(shí)例對(duì)應(yīng)的最小內(nèi)存值進(jìn)行比較。

步驟404,若小于第二預(yù)設(shè)閾值的內(nèi)存值大于最小內(nèi)存值,則在第二實(shí)例集合中,將最小內(nèi)存值對(duì)應(yīng)的實(shí)例置換成小于第二預(yù)設(shè)閾值的內(nèi)存值對(duì)應(yīng)的實(shí)例,執(zhí)行圖1所示實(shí)施例中的步驟103,流程結(jié)束。

在步驟403和步驟404中,為防止第二實(shí)例集合中包含的實(shí)例的數(shù)量較多導(dǎo)致一些可疑的實(shí)例沒有添加到第二實(shí)例集合中的情形,可以將與應(yīng)用程序相關(guān)的并且未記錄在第二實(shí)例集合中的實(shí)例的內(nèi)存值與第二預(yù)設(shè)閾值進(jìn)行比較,對(duì)于內(nèi)存值大于第二預(yù)設(shè)閾值的實(shí)例,則可對(duì)第二實(shí)例集合的容量加一,同時(shí)將該實(shí)例添加到第二實(shí)例集合中;對(duì)與應(yīng)用程序相關(guān)的并且未記錄在第二實(shí)例集合中的內(nèi)存值小于第二預(yù)設(shè)閾值的實(shí)例,可繼續(xù)按照排序規(guī)則(例如,堆排序),將與應(yīng)用程序相關(guān)的并且未記錄在第二實(shí)例集合中的實(shí)例的內(nèi)存值與第二實(shí)例中的最小內(nèi)存值進(jìn)行比較,若與應(yīng)用程序相關(guān)的并且未記錄在第二實(shí)例集合中的實(shí)例的內(nèi)存值大于第二實(shí)例集合中的最小內(nèi)存值,則將第二實(shí)例集合中的與最小內(nèi)存值對(duì)應(yīng)的實(shí)例置換成與應(yīng)用程序相關(guān)的并且未記錄在第二實(shí)例集合中的內(nèi)存值大于第二實(shí)例集合中的最小內(nèi)存值的實(shí)例。如圖4b所示,第二實(shí)例集合32包括實(shí)例1-實(shí)例10。如圖4c所示,可將與應(yīng)用程序相關(guān)的并且未記錄在第二實(shí)例集合中的實(shí)例視為一個(gè)集合31,對(duì)于集合31中的一個(gè)實(shí)例a,將實(shí)例a的內(nèi)存值與第二預(yù)設(shè)閾值進(jìn)行比較,若實(shí)例a的內(nèi)存值大于第二預(yù)設(shè)閾值,則可以將實(shí)例a添加到第二實(shí)例集合32中。如圖4d所示,若實(shí)例a的內(nèi)存值小于第二預(yù)設(shè)閾值,則將實(shí)例a的內(nèi)存值與第二實(shí)例集合32中的最小內(nèi)存值(例如,編號(hào)為7的實(shí)例對(duì)應(yīng)的內(nèi)存值)進(jìn)行比較,例如,第二實(shí)例集合中編號(hào)為7的實(shí)例的內(nèi)存值為最小值,若實(shí)例a的內(nèi)存值小于實(shí)例7的內(nèi)存值,則可以將實(shí)例a丟棄,若實(shí)例a的內(nèi)存值大于實(shí)例7的內(nèi)存值,則可以將實(shí)例7替換成實(shí)例a。

在一實(shí)施例中,第二預(yù)設(shè)閾值可以由內(nèi)存鏡像文件大小以及一個(gè)預(yù)設(shè)百分比來(lái)確定,例如,內(nèi)存鏡像文件的大小為100m,則第二預(yù)設(shè)閾值為100m的5%,6%,等等。需要說明的是,5%以及6%為示例性說明,其不能形成對(duì)本申請(qǐng)的限制。

本實(shí)施例中,通過將與應(yīng)用程序相關(guān)的并且未記錄在第二實(shí)例集合中的實(shí)例對(duì)第二實(shí)例集合進(jìn)行擴(kuò)容,可以防止第二實(shí)例集合中包含的實(shí)例的數(shù)量較多導(dǎo)致一些可疑的實(shí)例沒有添加到第二實(shí)例集合中的情形,由于本實(shí)施例是通過導(dǎo)致內(nèi)存泄漏的直接原因得到的第二實(shí)例集合,即實(shí)例本身被回收可釋放的總內(nèi)存較大,或者是反復(fù)操作不斷產(chǎn)生泄漏,相比現(xiàn)有技術(shù)中的預(yù)先定義需要懷疑內(nèi)存泄露的對(duì)象集合會(huì)出現(xiàn)定義不準(zhǔn)確的缺陷,本實(shí)施例的通用性更強(qiáng)。

圖5a是本申請(qǐng)又一示例性實(shí)施例示出的內(nèi)存檢測(cè)方法的流程示意圖,圖5b是圖5a所示實(shí)施例中應(yīng)用程序在運(yùn)行過程中的內(nèi)存值的示意圖,圖5c是圖5a所示實(shí)施例中的波谷點(diǎn)的示意圖;本實(shí)施例在上述實(shí)施例的基礎(chǔ)上,以如何監(jiān)測(cè)應(yīng)用程序在運(yùn)行過程中占用的內(nèi)存是否需要檢測(cè)為例進(jìn)行示例性說明,如圖5a所示,包括如下步驟:

步驟501,當(dāng)監(jiān)測(cè)到應(yīng)用程序在運(yùn)行過程中占用的內(nèi)存值高于第三預(yù)設(shè)閾值時(shí),連續(xù)采樣應(yīng)用程序的內(nèi)存值,得到n個(gè)采樣點(diǎn),其中,n為正整數(shù)。

在一實(shí)施例中,第三預(yù)設(shè)閾值可以由應(yīng)用程序正常運(yùn)行時(shí)達(dá)到的最大值來(lái)確定,本申請(qǐng)對(duì)第三預(yù)設(shè)閾值的具體大小不做限制。如圖5b所示,為應(yīng)用程序在運(yùn)行過程中的內(nèi)存值的動(dòng)態(tài)示意圖,其中水平方向?yàn)闀r(shí)間,豎直方向?yàn)閮?nèi)存值的大小,通過圖5b可知在應(yīng)用程序運(yùn)行過程中,應(yīng)用程序占用的內(nèi)存值隨著時(shí)間會(huì)動(dòng)態(tài)變化,其中的箭頭指向的點(diǎn)為本申請(qǐng)中所述波谷點(diǎn)。

步驟502,確定n個(gè)采樣點(diǎn)中的m個(gè)波谷點(diǎn),其中,m為正整數(shù),并且m<n。

如圖5c所示,波谷點(diǎn)可以視為內(nèi)存值動(dòng)態(tài)變化曲線中的凹點(diǎn)。

步驟503,對(duì)m個(gè)波谷點(diǎn)進(jìn)行曲線擬合,基于曲線擬合的結(jié)果確定應(yīng)用程序的內(nèi)存值的變化趨勢(shì)。

在一實(shí)施例中,可以通過現(xiàn)有技術(shù)中的擬合算法(例如,多項(xiàng)式函數(shù)擬合算法、最小二乘法擬合算法)等擬合出該m個(gè)波谷點(diǎn)對(duì)應(yīng)的曲線圖,通過曲線圖來(lái)確定內(nèi)存值的變化趨勢(shì)。在一實(shí)施例中,內(nèi)存值的變化趨勢(shì)可以包括上升趨勢(shì)和下降趨勢(shì),若為下降趨勢(shì),表明應(yīng)用程序的內(nèi)存消耗在降低,應(yīng)用程序不會(huì)出現(xiàn)內(nèi)存溢出的情形,若為上升趨勢(shì),表明應(yīng)用程序中可能存在未釋放并且已經(jīng)不再使用的內(nèi)存。

步驟504,當(dāng)變化趨勢(shì)為上升趨勢(shì)時(shí),確定應(yīng)用程序占用的內(nèi)存需要檢測(cè)。

在一實(shí)施例中,可以提示應(yīng)用程序存在內(nèi)存泄漏的風(fēng)險(xiǎn),并啟動(dòng)執(zhí)行上述圖1所示實(shí)施例的方法流程,及時(shí)檢測(cè)應(yīng)用程序是否存在內(nèi)存泄露。

本實(shí)施例中,通過對(duì)波谷點(diǎn)進(jìn)行曲線擬合,當(dāng)擬合得到的曲線呈現(xiàn)上升趨勢(shì)時(shí),判斷出應(yīng)用程序出現(xiàn)內(nèi)存泄漏,由于連續(xù)內(nèi)存值的波谷點(diǎn)更能真實(shí)反映應(yīng)用程序的內(nèi)存實(shí)際使用情況,因此本實(shí)施例能夠更準(zhǔn)確地判斷內(nèi)存泄漏的風(fēng)險(xiǎn)。

與前述內(nèi)存檢測(cè)方法的實(shí)施例相對(duì)應(yīng),本申請(qǐng)還提供了內(nèi)存檢測(cè)裝置的實(shí)施例。

圖6是本申請(qǐng)一示例性實(shí)施例示出的內(nèi)存檢測(cè)裝置的結(jié)構(gòu)示意圖,如圖6,內(nèi)存檢測(cè)裝置可包括:第一確定單元61、第二確定單元62、檢測(cè)結(jié)果生成單元63;其中,

第一確定單元61,用于當(dāng)監(jiān)測(cè)到應(yīng)用程序在運(yùn)行過程中占用的內(nèi)存需要檢測(cè)時(shí),確定與應(yīng)用程序相關(guān)的第一實(shí)例集合;

第二確定單元62,用于基于第一確定單元61確定的第一實(shí)例集合中每一個(gè)實(shí)例占用的內(nèi)存值,從第一實(shí)例集合中確定用于分析應(yīng)用程序出現(xiàn)內(nèi)存泄漏的第二實(shí)例集合;

檢測(cè)結(jié)果生成單元63,用于基于第二確定單元62確定的第二實(shí)例集合中每一個(gè)實(shí)例的路徑信息,生成關(guān)于應(yīng)用程序出現(xiàn)內(nèi)存泄漏的檢測(cè)結(jié)果。

圖7是本申請(qǐng)另一示例性實(shí)施例示出的內(nèi)存檢測(cè)裝置的結(jié)構(gòu)示意圖,如圖7所示,在上述圖6所示實(shí)施例的基礎(chǔ)上,第一確定單元61可包括:

第一確定子單元611,用于確定用于記錄應(yīng)用程序的內(nèi)存信息的內(nèi)存鏡像文件;

第二確定子單元612,用于在解析第一確定子單元611確定的內(nèi)存鏡像文件的過程中,確定第一實(shí)例集合中已記錄的與當(dāng)前正在解析的具有相同實(shí)例名稱并且具有相同大小的實(shí)例的數(shù)量;

第一記錄子單元613,用于若第二確定子單元612確定的實(shí)例的數(shù)量小于第一預(yù)設(shè)閾值,將當(dāng)前正在解析的實(shí)例記錄在第一實(shí)例集合中,以及,更新與當(dāng)前正在解析的實(shí)例具有相同實(shí)例名稱并且具有相同大小的實(shí)例的數(shù)量;

第二記錄子單元614,用于若第二確定子單元612確定的實(shí)例的數(shù)量等于第一預(yù)設(shè)閾值,將當(dāng)前正在解析的實(shí)例記錄在第三實(shí)例集合中。

在一實(shí)施例中,第二確定單元62可包括:

路徑合并子單元621,用于在檢測(cè)結(jié)果生成單元63生成關(guān)于應(yīng)用程序出現(xiàn)內(nèi)存泄漏的檢測(cè)結(jié)果之前,根據(jù)實(shí)例名稱、該實(shí)例對(duì)應(yīng)的父實(shí)例的名稱,對(duì)與所述應(yīng)用程序相關(guān)的并且未記錄在第二實(shí)例集合中的實(shí)例進(jìn)行路徑合并;

第一添加子單元622,用于當(dāng)路徑合并子單元621合并后的實(shí)例的內(nèi)存值符合預(yù)設(shè)條件時(shí),將合并后的實(shí)例添加到第二實(shí)例集合中。

在一實(shí)施例中,第二確定單元62還可包括:

比較子單元623,用于在檢測(cè)結(jié)果生成單元63生成關(guān)于所述應(yīng)用程序出現(xiàn)內(nèi)存泄漏的檢測(cè)結(jié)果之前,將與應(yīng)用程序相關(guān)的并且未記錄在第二實(shí)例集合中的每一個(gè)實(shí)例的內(nèi)存值與第二預(yù)設(shè)閾值進(jìn)行比較;

第二添加子單元624,用于將比較子單元623比較的內(nèi)存值大于第二預(yù)設(shè)閾值的實(shí)例添加到第二實(shí)例集合中。

在一實(shí)施例中,內(nèi)存檢測(cè)裝置還可包括:

比較單元64,用于在比較子單元623將與應(yīng)用程序相關(guān)的并且未記錄在第二實(shí)例集合中的每一個(gè)實(shí)例的內(nèi)存值與第二預(yù)設(shè)閾值進(jìn)行比較之后,對(duì)內(nèi)存值小于第二預(yù)設(shè)閾值的第三實(shí)例集合中的實(shí)例,將小于第二預(yù)設(shè)閾值的內(nèi)存值與第二實(shí)例集合對(duì)應(yīng)的最小內(nèi)存值進(jìn)行比較;

實(shí)例置換單元65,用于若比較單元64比較的結(jié)果表示小于第二預(yù)設(shè)閾值的內(nèi)存值大于最小內(nèi)存值,則在第二實(shí)例集合中,將最小內(nèi)存值對(duì)應(yīng)的實(shí)例置換成小于預(yù)設(shè)閾值的內(nèi)存值對(duì)應(yīng)的實(shí)例。

在一實(shí)施例中,第二確定單元62還可包括:

統(tǒng)計(jì)子單元625,用于統(tǒng)計(jì)第一實(shí)例集合中的具有相同實(shí)例名稱并且具有相同大小的實(shí)例,得到多個(gè)實(shí)例組,多個(gè)實(shí)例組中的每一個(gè)實(shí)例組包括至少一個(gè)實(shí)例;

加和子單元626,用于對(duì)統(tǒng)計(jì)子單元625統(tǒng)計(jì)出的每一個(gè)實(shí)例組中的實(shí)例的內(nèi)存值進(jìn)行加和,得到多個(gè)實(shí)例組各自對(duì)應(yīng)的內(nèi)存和值;

排序子單元627,用于基于加和子單元626得到的多個(gè)實(shí)例組各自對(duì)應(yīng)的內(nèi)存和值,對(duì)實(shí)例組按照預(yù)設(shè)順序進(jìn)行排序;

第三確定子單元628,用于基于排序子單元627對(duì)內(nèi)存和值由大到小的順序,確定排在前設(shè)定位數(shù)的實(shí)例組,排在前設(shè)定位數(shù)的實(shí)例組形成用于分析應(yīng)用程序出現(xiàn)內(nèi)存泄漏的第二實(shí)例集合。

在一實(shí)施例中,內(nèi)存檢測(cè)裝置還可包括:

采樣單元66,用于當(dāng)監(jiān)測(cè)到應(yīng)用程序在運(yùn)行過程中占用的內(nèi)存值高于第三預(yù)設(shè)閾值時(shí),連續(xù)采樣應(yīng)用程序的內(nèi)存值,得到n個(gè)采樣點(diǎn),其中,n為正整數(shù);

第三確定單元67,用于確定采樣單元66采樣得到的n個(gè)采樣點(diǎn)中的m個(gè)波谷點(diǎn),其中,m為正整數(shù),并且m<n;

曲線擬合單元68,用于對(duì)第三確定單元67確定的m個(gè)波谷點(diǎn)進(jìn)行曲線擬合,基于曲線擬合的結(jié)果確定應(yīng)用程序的內(nèi)存值的變化趨勢(shì);

第四確定單元69,用于若變化趨勢(shì)為上升趨勢(shì),確定應(yīng)用程序占用的內(nèi)存需要檢測(cè),第一確定單元61執(zhí)行確定與應(yīng)用程序相關(guān)的第一實(shí)例集合的步驟。

本申請(qǐng)內(nèi)存檢測(cè)裝置的實(shí)施例可以應(yīng)用在電子設(shè)備上。裝置實(shí)施例可以通過軟件實(shí)現(xiàn),也可以通過硬件或者軟硬件結(jié)合的方式實(shí)現(xiàn)。以軟件實(shí)現(xiàn)為例,作為一個(gè)邏輯意義上的裝置,是通過其所在電子設(shè)備的處理器將非易失性存儲(chǔ)器中對(duì)應(yīng)的計(jì)算機(jī)程序指令讀取到內(nèi)存中運(yùn)行形成的。從硬件層面而言,如圖8所示,為本申請(qǐng)內(nèi)存檢測(cè)裝置所在電子設(shè)備的一種硬件結(jié)構(gòu)圖,除了圖8所示的處理器、內(nèi)存、網(wǎng)絡(luò)接口、以及非易失性存儲(chǔ)器之外,實(shí)施例中裝置所在的電子設(shè)備通常根據(jù)該電子設(shè)備的實(shí)際功能,還可以包括其他硬件,對(duì)此不再贅述。

上述裝置中各個(gè)單元的功能和作用的實(shí)現(xiàn)過程具體詳見上述方法中對(duì)應(yīng)步驟的實(shí)現(xiàn)過程,在此不再贅述。

對(duì)于裝置實(shí)施例而言,由于其基本對(duì)應(yīng)于方法實(shí)施例,所以相關(guān)之處參見方法實(shí)施例的部分說明即可。以上所描述的裝置實(shí)施例僅僅是示意性的,其中所述作為分離部件說明的單元可以是或者也可以不是物理上分開的,作為單元顯示的部件可以是或者也可以不是物理單元,即可以位于一個(gè)地方,或者也可以分布到多個(gè)網(wǎng)絡(luò)單元上??梢愿鶕?jù)實(shí)際的需要選擇其中的部分或者全部模塊來(lái)實(shí)現(xiàn)本申請(qǐng)方案的目的。本領(lǐng)域普通技術(shù)人員在不付出創(chuàng)造性勞動(dòng)的情況下,即可以理解并實(shí)施。

本領(lǐng)域技術(shù)人員在考慮說明書及實(shí)踐這里公開的發(fā)明后,將容易想到本申請(qǐng)的其它實(shí)施方案。本申請(qǐng)旨在涵蓋本申請(qǐng)的任何變型、用途或者適應(yīng)性變化,這些變型、用途或者適應(yīng)性變化遵循本申請(qǐng)的一般性原理并包括本申請(qǐng)未公開的本技術(shù)領(lǐng)域中的公知常識(shí)或慣用技術(shù)手段。說明書和實(shí)施例僅被視為示例性的,本申請(qǐng)的真正范圍和精神由下面的權(quán)利要求指出。

還需要說明的是,術(shù)語(yǔ)“包括”、“包含”或者其任何其他變體意在涵蓋非排他性的包含,從而使得包括一系列要素的過程、方法、商品或者設(shè)備不僅包括那些要素,而且還包括沒有明確列出的其他要素,或者是還包括為這種過程、方法、商品或者設(shè)備所固有的要素。在沒有更多限制的情況下,由語(yǔ)句“包括一個(gè)……”限定的要素,并不排除在包括所述要素的過程、方法、商品或者設(shè)備中還存在另外的相同要素。

以上所述僅為本申請(qǐng)的較佳實(shí)施例而已,并不用以限制本申請(qǐng),凡在本申請(qǐng)的精神和原則之內(nèi),所做的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本申請(qǐng)保護(hù)的范圍之內(nèi)。

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