Jvm在線內(nèi)存泄露分析方法及系統(tǒng)的制作方法
【專(zhuān)利摘要】本發(fā)明提供一種JVM在線內(nèi)存泄露分析方法及系統(tǒng),所述方法包括以下步驟:獲取引用關(guān)系樹(shù)中各節(jié)點(diǎn)信息,所述節(jié)點(diǎn)信息包括對(duì)象的數(shù)量及節(jié)點(diǎn)占用空間的大??;在預(yù)定時(shí)間后重新獲取所述引用關(guān)系樹(shù)中各節(jié)點(diǎn)信息,并根據(jù)兩次獲取的節(jié)點(diǎn)信息構(gòu)建相應(yīng)的引用關(guān)系變化樹(shù);根據(jù)所述引用關(guān)系變化樹(shù)在線分析JVM內(nèi)存泄露。本發(fā)明的一種JVM在線內(nèi)存泄露分析方法及系統(tǒng)能精確地在線分析JVM內(nèi)存泄露情況。
【專(zhuān)利說(shuō)明】JVM在線內(nèi)存泄露分析方法及系統(tǒng)
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及計(jì)算機(jī)【技術(shù)領(lǐng)域】,具體涉及一種JVM在線內(nèi)存泄露分析方法以及一種JVM在線內(nèi)存泄露分析系統(tǒng)。
【背景技術(shù)】
[0002]JVM (Java Virtual Machine, Java虛擬機(jī))運(yùn)行過(guò)程中,經(jīng)常出現(xiàn)內(nèi)存泄露情況。傳統(tǒng)的內(nèi)存泄露分析方法通常為:在發(fā)生OOM (Out Of Memory,內(nèi)存溢出)或者手動(dòng)dump之后,通過(guò)分析dump文件來(lái)分析內(nèi)存泄露情況。
[0003]另夕卜,JVM運(yùn)行過(guò)程中,可以借助Visualvm、JProfile監(jiān)控java虛擬機(jī)內(nèi)存中的引用關(guān)系樹(shù)個(gè)數(shù)、大小等,能粗略在線獲知JVM內(nèi)存溢出的信息。但這些信息過(guò)于籠統(tǒng),無(wú)法精確監(jiān)控分析虛擬機(jī)內(nèi)的對(duì)象及其變化情況。
【發(fā)明內(nèi)容】
[0004]基于此,本發(fā)明提供一種JVM在線內(nèi)存泄露分析方法及系統(tǒng),能精確的分析出JVM內(nèi)存泄露的情況。
[0005]為實(shí)現(xiàn)上述目的,本發(fā)明采用如下的技術(shù)方案:
[0006]一種JVM在線內(nèi)存泄露分析方法,包括以下步驟:
[0007]獲取引用關(guān)系樹(shù)中各節(jié)點(diǎn)信息,所述節(jié)點(diǎn)信息包括對(duì)象的數(shù)量及節(jié)點(diǎn)占用空間的大小;
[0008]在預(yù)定時(shí)間后重新獲取所述引用關(guān)系樹(shù)中各節(jié)點(diǎn)信息,并根據(jù)兩次獲取的節(jié)點(diǎn)信息構(gòu)建相應(yīng)的引用關(guān)系變化樹(shù);
[0009]根據(jù)所述引用關(guān)系變化樹(shù)在線分析JVM內(nèi)存泄露。
[0010]—種JVM在線內(nèi)存泄露分析系統(tǒng),包括:
[0011]獲取模塊,用于獲取引用關(guān)系樹(shù)中各節(jié)點(diǎn)信息,所述節(jié)點(diǎn)信息包括對(duì)象的數(shù)量及節(jié)點(diǎn)占用空間的大??;
[0012]構(gòu)建模塊,用于在預(yù)定時(shí)間后重新獲取所述引用關(guān)系樹(shù)中各節(jié)點(diǎn)信息,并根據(jù)兩次獲取的節(jié)點(diǎn)信息構(gòu)建引用關(guān)系變化樹(shù);
[0013]分析模塊,用于根據(jù)所述引用關(guān)系變化樹(shù)在線分析JVM內(nèi)存泄露。
[0014]綜上所述,本發(fā)明的一種JVM在線內(nèi)存泄露分析方法及系統(tǒng),通過(guò)分別獲取預(yù)定時(shí)間前后的引用關(guān)系書(shū)中各節(jié)點(diǎn)信息,根據(jù)兩次獲取的節(jié)點(diǎn)信息構(gòu)建相應(yīng)的引用關(guān)系變化樹(shù),并根據(jù)該引用關(guān)系變化樹(shù)進(jìn)行在線分析內(nèi)存的泄露情況。本發(fā)明的方案通過(guò)引用關(guān)系變化樹(shù)可以在各個(gè)時(shí)間段內(nèi)在線分析JVM內(nèi)存泄露的情況,因此不僅能在開(kāi)發(fā)初期精確地在線分析JVM是否存在內(nèi)存泄露,并且還能在發(fā)生OOM前發(fā)出預(yù)警并初步查找問(wèn)題。
【專(zhuān)利附圖】
【附圖說(shuō)明】
[0015]圖1為本發(fā)明實(shí)施例中的一種JVM在線內(nèi)存泄露分析方法的流程示意圖;[0016]圖2為本發(fā)明實(shí)施例中的基準(zhǔn)引用關(guān)系樹(shù)的示意圖;
[0017]圖3為本發(fā)明實(shí)施例中的變化后的引用關(guān)系樹(shù)的不意圖;
[0018]圖4為本發(fā)明實(shí)施例中的引用關(guān)系變化樹(shù)的不意圖;
[0019]圖5為本發(fā)明實(shí)施例中的一種JVM在線內(nèi)存泄露分析系統(tǒng)不意圖。
【具體實(shí)施方式】
[0020]為了使本發(fā)明的目的、技術(shù)方案及優(yōu)點(diǎn)更加清楚明白,以下結(jié)合附圖及實(shí)施例,對(duì)本發(fā)明進(jìn)行進(jìn)一步詳細(xì)說(shuō)明。應(yīng)當(dāng)理解,此處所描述的具體實(shí)施例僅僅用以解釋本發(fā)明,并不用于限定本發(fā)明。
[0021]參見(jiàn)圖1所示,一種JVM在線內(nèi)存泄露分析方法,包括以下步驟:
[0022]步驟S101,獲取引用關(guān)系樹(shù)中各節(jié)點(diǎn)信息,所述節(jié)點(diǎn)信息包括對(duì)象的數(shù)量及節(jié)點(diǎn)占用空間的大小。此步驟中獲取的引用關(guān)系樹(shù)可為對(duì)象的基準(zhǔn)引用關(guān)系樹(shù),并初始化對(duì)該應(yīng)用關(guān)系樹(shù)。獲取一次對(duì)象引用關(guān)系樹(shù)的過(guò)程和一次full GC類(lèi)似。結(jié)合參見(jiàn)圖2所示從,GC Root開(kāi)始向下搜索,建立引用關(guān)系樹(shù),在一個(gè)引用關(guān)系節(jié)點(diǎn)中,如果有相同累的多個(gè)對(duì)象,用數(shù)字標(biāo)示對(duì)象個(gè)數(shù),并記錄該節(jié)點(diǎn)節(jié)點(diǎn)占用空間的總大小。在建立引用關(guān)系過(guò)程中,遞歸引用不記錄,由于所以的對(duì)象都會(huì)引用java.lang.Class,故也不需要記錄到引用關(guān)系中。如圖2中所示的標(biāo)示為Object B (2,258)的節(jié)點(diǎn),表示類(lèi)B的實(shí)例對(duì)象有兩個(gè),占用總內(nèi)存空間為258。
[0023]步驟S102,在預(yù)定時(shí)間后重新獲取所述引用關(guān)系樹(shù)中各節(jié)點(diǎn)信息,并根據(jù)兩次獲取的節(jié)點(diǎn)信息構(gòu)建相應(yīng)的引用關(guān)系變化樹(shù)。在設(shè)定的時(shí)間間隔后或者在用戶操作觸發(fā)下(如用戶查看),重新獲取所述引用關(guān)系樹(shù),此時(shí)的引用關(guān)系樹(shù)相對(duì)基準(zhǔn)引用關(guān)系樹(shù)已經(jīng)發(fā)生了變化。經(jīng)過(guò)分析已經(jīng)變化的引用關(guān)系樹(shù),并和步驟SlOl中獲取的引用關(guān)系樹(shù)進(jìn)行比較計(jì)算,根據(jù)計(jì)算的結(jié)果獲得引用關(guān)系變化樹(shù)。將已經(jīng)變化的引用關(guān)系樹(shù)丟棄,并保存引用關(guān)系變化樹(shù)。
[0024]步驟S103,根據(jù)所述引用關(guān)系變化樹(shù)在線分析JVM內(nèi)存泄露。
[0025]作為一個(gè)較好的實(shí)施例,所述根據(jù)兩次獲取的節(jié)點(diǎn)信息構(gòu)建引用關(guān)系變化樹(shù)的過(guò)程具體可以包括以下步驟:
[0026]步驟S1021,將在預(yù)定時(shí)間后重新獲取所述引用關(guān)系樹(shù)減與間隔預(yù)定時(shí)間前獲取的引用關(guān)系樹(shù)進(jìn)行計(jì)算。如在構(gòu)建引用關(guān)系變化樹(shù)時(shí),由已經(jīng)變化的引用關(guān)系樹(shù)減去基準(zhǔn)引用關(guān)系樹(shù)產(chǎn)生。所述引用關(guān)系變化樹(shù)也由根節(jié)點(diǎn)出發(fā),到新增葉子節(jié)點(diǎn)為止。
[0027]步驟S1022,根據(jù)計(jì)算結(jié)果獲取各節(jié)點(diǎn)信息的變化信息。例如在兩個(gè)引用關(guān)系樹(shù)對(duì)比中節(jié)點(diǎn)無(wú)變化但有新增子節(jié)點(diǎn)時(shí),引用關(guān)系變化中記錄該變化信息,例如可以將對(duì)象節(jié)點(diǎn)個(gè)數(shù)和占用空間均為O。如圖2所示引用關(guān)系樹(shù)在一定時(shí)間間隔后變化為圖3引用關(guān)系樹(shù)。且兩個(gè)引用關(guān)系樹(shù)中節(jié)點(diǎn)Object A新增引用對(duì)象object D、根節(jié)點(diǎn)新增引用對(duì)象Object B、其引用對(duì)象 Object E。
[0028]步驟S1023,根據(jù)所述變化信息構(gòu)建引用關(guān)系變化樹(shù)。例如可以將上述的新增節(jié)點(diǎn)加入引用關(guān)系變化樹(shù)中,節(jié)點(diǎn)對(duì)象中記錄對(duì)象變化部分。構(gòu)建引用關(guān)系變化樹(shù),將圖2與圖3所示的引用關(guān)系樹(shù)進(jìn)行計(jì)算后得到的變化信息加入引用關(guān)系變化樹(shù)中。如圖4所示,節(jié)點(diǎn)Object A無(wú)變化但有新增子節(jié)點(diǎn),則引用關(guān)系變化中記錄該節(jié)點(diǎn)Object A (0,0),新增節(jié)點(diǎn)Object D、Object E加入樹(shù)中,而Object B增加一個(gè)對(duì)象,占用62字節(jié)空間,記錄Object B (1,62)。
[0029]作為一個(gè)較好的實(shí)施例,根據(jù)所述引用關(guān)系變化樹(shù)在線分析JVM內(nèi)存泄露的過(guò)程具體可以包括以下步驟:
[0030]對(duì)預(yù)定時(shí)間內(nèi)的引用關(guān)系變化樹(shù)中各節(jié)點(diǎn)進(jìn)行分析;
[0031]根據(jù)分析結(jié)果獲取引用關(guān)系樹(shù)中對(duì)象變化趨勢(shì)圖,能實(shí)現(xiàn)在線分析對(duì)象變化趨勢(shì);所述分析結(jié)果可以包括引用關(guān)系變化樹(shù)節(jié)中各節(jié)點(diǎn)的對(duì)象數(shù)量及占用的空間;
[0032]根據(jù)所述對(duì)象變化趨勢(shì)圖中預(yù)定的對(duì)象進(jìn)行在線分析JVM內(nèi)存泄漏。
[0033]由于虛擬機(jī)中可能有較多對(duì)象變化,所以預(yù)定對(duì)象可以指用戶指定的對(duì)象或者變化最多的節(jié)點(diǎn)對(duì)象。通過(guò)對(duì)預(yù)定對(duì)象的變化可以分析這些是否仍需留在虛擬機(jī)內(nèi)存是否由于內(nèi)存泄露引起,從而實(shí)現(xiàn)在線內(nèi)存泄露分析。
[0034]作為一個(gè)較好的實(shí)施例,根據(jù)所述引用關(guān)系變化樹(shù)在線分析內(nèi)存泄露的過(guò)程具體還可以包括以下步驟:
[0035]根據(jù)所述對(duì)象變化趨勢(shì)圖判斷是否存在內(nèi)存泄露;
[0036]若是,則說(shuō)明存在內(nèi)存泄漏,可以根據(jù)變化對(duì)象的引用關(guān)系查找引用路徑與內(nèi)存泄漏點(diǎn);否則不存在內(nèi)存泄漏,則繼續(xù)對(duì)引用關(guān)系樹(shù)進(jìn)行分析。通過(guò)對(duì)變化對(duì)象的引用關(guān)系的分析查看,可定位引用路徑和內(nèi)存泄露點(diǎn)。對(duì)持續(xù)增加的對(duì)象可以預(yù)判該點(diǎn)可能發(fā)生了內(nèi)存泄露并最終會(huì)導(dǎo)致虛擬機(jī)的00M,提前發(fā)出預(yù)警。例如,比較圖2與圖3所示的應(yīng)用關(guān)系樹(shù),節(jié)點(diǎn)Object B的對(duì)象由(2,258)變化成了 (3,20),可知Object B的對(duì)象增加了一個(gè),占用空間62,總增加空間86 (由于B引用的Object E無(wú)其它引用,計(jì)入B總空間),在此時(shí)間間隔內(nèi),如對(duì)象B無(wú)此變化的理由,則可以判定對(duì)象B發(fā)生了內(nèi)存泄露,從而定位問(wèn)題。
[0037]與上述實(shí)施例中的一種JVM在線內(nèi)存泄露分析方法相對(duì)應(yīng),本發(fā)明的實(shí)施例還提供一種JVM在線內(nèi)存泄露分析系統(tǒng),如圖5所不,包括:
[0038]獲取模塊101,用于獲取引用關(guān)系樹(shù)中各節(jié)點(diǎn)信息,所述節(jié)點(diǎn)信息包括對(duì)象的數(shù)量及節(jié)點(diǎn)占用空間的大??;
[0039]構(gòu)建模塊102,用于在預(yù)定時(shí)間后重新獲取所述引用關(guān)系樹(shù)中各節(jié)點(diǎn)信息,并根據(jù)兩次獲取的節(jié)點(diǎn)信息構(gòu)建引用關(guān)系變化樹(shù);
[0040]分析模塊103,用于根據(jù)所述引用關(guān)系變化樹(shù)在線分析JVM內(nèi)存泄露。
[0041]作為一個(gè)較好的實(shí)施例,所述構(gòu)建模塊具體可以包括:
[0042]計(jì)算模塊,用于將在預(yù)定時(shí)間后重新獲取所述引用關(guān)系樹(shù)與在間隔預(yù)定時(shí)間前獲取的引用關(guān)系樹(shù)進(jìn)行計(jì)算;
[0043]變化信息獲取模塊,用于根據(jù)計(jì)算結(jié)果獲取各節(jié)點(diǎn)信息的變化信息;
[0044]構(gòu)建子模塊,用于根據(jù)所述變化信息構(gòu)建引用關(guān)系變化樹(shù)。
[0045]作為一個(gè)較好的實(shí)施例,所述分析模塊具體還可以包括:
[0046]第一分析子模塊,用于對(duì)預(yù)定時(shí)間內(nèi)的引用關(guān)系變化樹(shù)中各節(jié)點(diǎn)進(jìn)行分析;
[0047]趨勢(shì)圖獲取模塊,用于根據(jù)分析結(jié)果獲取各節(jié)點(diǎn)中對(duì)象變化趨勢(shì)圖;
[0048]第二分析子模塊,用于根據(jù)所述對(duì)象變化趨勢(shì)圖中預(yù)定的對(duì)象進(jìn)行在線分析JVM內(nèi)存泄漏。
[0049]作為一個(gè)較好的實(shí)施例,所述分析模塊具體還可以包括:[0050]判斷模塊,用于根據(jù)所述對(duì)象變化趨勢(shì)圖判斷是否存在內(nèi)存泄露;
[0051]查找模塊,用于在所述判斷模塊的判斷結(jié)果為是時(shí),根據(jù)變化對(duì)象的引用關(guān)系查詢(xún)引用路徑與內(nèi)存泄漏點(diǎn)。
[0052]上述一種JVM在線內(nèi)存泄露分析系統(tǒng)的其它技術(shù)特征與本發(fā)明的一種JVM在線內(nèi)存泄露分析方法相同,此處不予贅述。
[0053]通過(guò)以上方案可以看出,本發(fā)明實(shí)施例的一種JVM在線內(nèi)存泄露分析方法及系統(tǒng),通過(guò)分別獲取預(yù)定時(shí)間前后的引用關(guān)系書(shū)中各節(jié)點(diǎn)信息,根據(jù)兩次獲取的節(jié)點(diǎn)信息構(gòu)建相應(yīng)的引用關(guān)系變化樹(shù),并根據(jù)該引用關(guān)系變化樹(shù)進(jìn)行在線分析內(nèi)存的泄露情況。本發(fā)明的方案通過(guò)引用關(guān)系變化樹(shù)可以在各個(gè)時(shí)間段內(nèi)在線分析JVM內(nèi)存泄露的情況,因此不僅能在開(kāi)發(fā)初期精確地在線分析JVM是否存在內(nèi)存泄露,并且還能在發(fā)生OOM前發(fā)出預(yù)警并初步查找問(wèn)題。
[0054]需要說(shuō)明的是,除非上下文另有特定清楚的描述,本發(fā)明中的元件和組件,數(shù)量既可以單個(gè)的形式存在,也可以多個(gè)的形式存在,本發(fā)明并不對(duì)此進(jìn)行限定。另外,本發(fā)明中的步驟雖然用標(biāo)號(hào)進(jìn)行了排列,但并不用于限定步驟的先后次序,除非明確說(shuō)明了步驟的次序或者某步驟的執(zhí)行需要其他步驟作為基準(zhǔn),否則步驟的相對(duì)次序是可以調(diào)整的。
[0055]以上所述實(shí)施例僅表達(dá)了本發(fā)明的幾種實(shí)施方式,其描述較為具體和詳細(xì),但并不能因此而理解為對(duì)本發(fā)明專(zhuān)利范圍的限制。應(yīng)當(dāng)指出的是,對(duì)于本領(lǐng)域的普通技術(shù)人員來(lái)說(shuō),在不脫離本發(fā)明構(gòu)思的前提下,還可以做出若干變形和改進(jìn),這些都屬于本發(fā)明的保護(hù)范圍。因此,本發(fā)明專(zhuān)利的保護(hù)范圍應(yīng)以所附權(quán)利要求為準(zhǔn)。
【權(quán)利要求】
1.一種JVM在線內(nèi)存泄露分析方法,其特征在于,包括以下步驟: 獲取引用關(guān)系樹(shù)中各節(jié)點(diǎn)信息,所述節(jié)點(diǎn)信息包括對(duì)象的數(shù)量及節(jié)點(diǎn)占用空間的大小; 在預(yù)定時(shí)間后重新獲取所述引用關(guān)系樹(shù)中各節(jié)點(diǎn)信息,并根據(jù)兩次獲取的節(jié)點(diǎn)信息構(gòu)建相應(yīng)的引用關(guān)系變化樹(shù); 根據(jù)所述引用關(guān)系變化樹(shù)在線分析JVM內(nèi)存泄露。
2.根據(jù)權(quán)利要求1所述的JVM在線內(nèi)存泄露分析方法,其特征在于,根據(jù)所述引用關(guān)系變化樹(shù)在線分析JVM內(nèi)存泄露的過(guò)程包括以下步驟: 對(duì)預(yù)定時(shí)間內(nèi)的引用關(guān)系變化樹(shù)中各節(jié)點(diǎn)進(jìn)行分析; 根據(jù)分析結(jié)果獲取引用關(guān)系樹(shù)中對(duì)象變化趨勢(shì)圖; 根據(jù)所述對(duì)象變化趨勢(shì)圖中預(yù)定的對(duì)象進(jìn)行在線分析JVM內(nèi)存泄漏。
3.根據(jù)權(quán)利要求2所述的JVM在線內(nèi)存泄露分析方法,其特征在于,根據(jù)所述引用關(guān)系變化樹(shù)在線分析內(nèi)存泄露的過(guò)程還包括以下步驟: 根據(jù)所述對(duì)象變化趨勢(shì)圖判 斷是否存在內(nèi)存泄露; 若是,則根據(jù)變化對(duì)象的引用關(guān)系查找引用路徑與內(nèi)存泄漏點(diǎn)。
4.根據(jù)權(quán)利要求1所述的JVM在線內(nèi)存泄露分析方法,其特征在于,所述根據(jù)兩次獲取的節(jié)點(diǎn)信息構(gòu)建引用關(guān)系變化樹(shù)的過(guò)程包括以下步驟: 將在預(yù)定時(shí)間后重新獲取所述引用關(guān)系樹(shù)減與間隔預(yù)定時(shí)間前獲取的引用關(guān)系樹(shù)進(jìn)行計(jì)算; 根據(jù)計(jì)算結(jié)果獲取各節(jié)點(diǎn)信息的變化信息; 根據(jù)所述變化信息構(gòu)建引用關(guān)系變化樹(shù)。
5.一種JVM在線內(nèi)存泄露分析系統(tǒng),其特征在于,包括: 獲取模塊,用于獲取引用關(guān)系樹(shù)中各節(jié)點(diǎn)信息,所述節(jié)點(diǎn)信息包括對(duì)象的數(shù)量及節(jié)點(diǎn)占用空間的大?。? 構(gòu)建模塊,用于在預(yù)定時(shí)間后重新獲取所述引用關(guān)系樹(shù)中各節(jié)點(diǎn)信息,并根據(jù)兩次獲取的節(jié)點(diǎn)信息構(gòu)建引用關(guān)系變化樹(shù); 分析模塊,用于根據(jù)所述引用關(guān)系變化樹(shù)在線分析JVM內(nèi)存泄露。
6.根據(jù)權(quán)利要求5所述的JVM在線內(nèi)存泄露分析系統(tǒng),其特征在于,所述分析模塊包括: 第一分析子模塊,用于對(duì)預(yù)定時(shí)間內(nèi)的引用關(guān)系變化樹(shù)中各節(jié)點(diǎn)進(jìn)行分析; 趨勢(shì)圖獲取模塊,用于根據(jù)分析結(jié)果獲取各節(jié)點(diǎn)中對(duì)象變化趨勢(shì)圖; 第二分析子模塊,用于根據(jù)所述對(duì)象變化趨勢(shì)圖中預(yù)定的對(duì)象進(jìn)行在線分析JVM內(nèi)存泄漏。
7.根據(jù)權(quán)利要求6所述的JVM在線內(nèi)存泄露分析系統(tǒng),其特征在于,所述分析模塊還包括: 判斷模塊,用于根據(jù)所述對(duì)象變化趨勢(shì)圖判斷是否存在內(nèi)存泄露; 查找模塊,用于在所述判斷模塊的判斷結(jié)果為是時(shí),根據(jù)變化對(duì)象的引用關(guān)系查詢(xún)引用路徑與內(nèi)存泄漏點(diǎn)。
8.根據(jù)權(quán)利要求5所述的JVM在線內(nèi)存泄露分析系統(tǒng),其特征在于,所述構(gòu)建模塊包括: 計(jì)算模塊,用于將在預(yù)定時(shí)間后重新獲取所述引用關(guān)系樹(shù)與在間隔預(yù)定時(shí)間前獲取的引用關(guān)系樹(shù)進(jìn)行計(jì)算; 變化信息獲取模塊,用于根據(jù)計(jì)算結(jié)果獲取各節(jié)點(diǎn)信息的變化信息; 構(gòu)建子模塊,用于根據(jù)所述變化信·息構(gòu)建引用關(guān)系變化樹(shù)。
【文檔編號(hào)】G06F11/36GK103714004SQ201410002172
【公開(kāi)日】2014年4月9日 申請(qǐng)日期:2014年1月2日 優(yōu)先權(quán)日:2014年1月2日
【發(fā)明者】賀召軍 申請(qǐng)人:金蝶軟件(中國(guó))有限公司