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

一種在JVM中動態(tài)計算對象重用價值的方法與流程

文檔序號:12363082閱讀:317來源:國知局
一種在JVM中動態(tài)計算對象重用價值的方法與流程

本發(fā)明屬于計算機應(yīng)用技術(shù)領(lǐng)域,具體地說,是指一種在JVM(Java虛擬機)中動態(tài)計算對象重用價值的方法。



背景技術(shù):

Android應(yīng)用程序常常會在使用中出現(xiàn)一些卡頓的情況。Android應(yīng)用程序大部分都是使用Java語言編寫的,在程序正確編寫的情況下,這種卡頓很多都是由JVM引起的。在程序正常運行的時候,如果大量對象分配后快速死亡接著重新分配或者大量對象長期不使用占用內(nèi)存,容易引起虛擬機對內(nèi)存垃圾進行收集(Garbage Collection)。內(nèi)存垃圾收集器對內(nèi)存對象進行回收是一種機械式的管理并且是一種耗時的工作,就會對當(dāng)前程序的運行造成影響,出現(xiàn)卡頓的情況。如果能重用一些死亡的對象,減少垃圾回收的時間,就有可能減少出現(xiàn)卡頓的幾率。



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

本發(fā)明針對上述問題,提出一種在程序運行中確定應(yīng)用程序中對象重用價值的方法,下次有用戶安裝相同應(yīng)用程序時,在程序編譯時可以使用統(tǒng)計的結(jié)果對相應(yīng)對象的分配進行優(yōu)化,同時統(tǒng)計的結(jié)果也可以反饋給開發(fā)人員用以改進相應(yīng)程序。

本發(fā)明提供的一種在Java虛擬機中動態(tài)計算對象重用價值的方法,實現(xiàn)方案是:

(1)在程序開始運行時,JVM在內(nèi)存中為程序新建一塊存放統(tǒng)計數(shù)據(jù)的區(qū)域Sspace;

(2)修改JVM的類加載器ClassLoader,在加載一個新類的時候,在方法區(qū)為該類的類信息新增一個指針P,為該類在Sspace中分配一個數(shù)據(jù)結(jié)構(gòu)Sstruct,指針P指向該類對象運行時統(tǒng)計的數(shù)據(jù)結(jié)構(gòu)Sstruct;

(3)為一個類分配的數(shù)據(jù)結(jié)構(gòu)Sstruct中,包含四個參數(shù)和一個指針;四個參數(shù)為:該類對象的重用價值V,執(zhí)行完上次GC之后該類對象存活的個數(shù)O,上次GC前該類對象的個數(shù)B,在下次GC前該類對象的個數(shù)A;指針R指向該類在方法區(qū)的類信息。在Sstruct初始化時,將V、B、O、A均置為0,將R指向類信息在方法區(qū)的地址;GC代表內(nèi)存垃圾回收。

在執(zhí)行本次GC時,對每個類對象,根據(jù)下式計算重用價值v:

<mrow> <mi>v</mi> <mo>=</mo> <mfrac> <mrow> <mi>B</mi> <mo>+</mo> <mi>O</mi> <mo>+</mo> <mi>A</mi> </mrow> <mn>3</mn> </mfrac> <mo>&times;</mo> <mfrac> <mrow> <mi>a</mi> <mi>t</mi> <mi>a</mi> <mi>n</mi> <mrow> <mo>(</mo> <mi>A</mi> <mo>-</mo> <mi>O</mi> <mo>)</mo> </mrow> </mrow> <mrow> <mi>B</mi> <mo>-</mo> <mi>O</mi> </mrow> </mfrac> <mo>&times;</mo> <mfrac> <mn>2</mn> <mi>&pi;</mi> </mfrac> </mrow>

然后,將v增加到對應(yīng)的V上。

本發(fā)明的優(yōu)點與積極效果在于:采用本發(fā)明方法,可分析出在程序運行過程中可重用的價值較高的對象,從而可反復(fù)利用這種對象的內(nèi)存,減少因為垃圾回收所帶來的性能損失,減少出現(xiàn)卡頓的幾率。

附圖說明

圖1是本發(fā)明在JVM中動態(tài)計算對象重用價值方法中記錄并處理數(shù)據(jù)的流程圖;

圖2是本發(fā)明實現(xiàn)在JVM中動態(tài)計算對象重用價值時修改和新增的數(shù)據(jù)結(jié)構(gòu)示意圖;

圖3是本發(fā)明方法在新增對象時的處理方法示意圖;

圖4是一次GC發(fā)生時對象個數(shù)增減的示意圖;

圖5是垃圾回收的示意圖。

具體實施方式

下面將結(jié)合附圖和實施例對本發(fā)明作進一步的詳細說明。

本發(fā)明的技術(shù)方案可以在內(nèi)存管理芯片硬件內(nèi)部實現(xiàn),也可以遵照所述實現(xiàn)方案,完全或部分由軟件實現(xiàn)。本發(fā)明通過對Java虛擬機的修改,在Java程序運行時,修改過后的Java虛擬機會記錄下來該Java程序運行的信息。

本發(fā)明的在Java虛擬機中動態(tài)計算對象重用價值的方法,整體流程如圖1所示。首先,在程序開始運行時,JVM在內(nèi)存中將為程序新建一塊存放統(tǒng)計數(shù)據(jù)的區(qū)域Sspace,如圖2所示。當(dāng)內(nèi)存垃圾收集器開始工作后,它將按照圖1所示流程,在內(nèi)存中新建的Sspace中記錄在每次GC(Garbage Collection,內(nèi)存垃圾回收)前后,各個對象的個數(shù)。然后根據(jù)統(tǒng)計的數(shù)據(jù),計算每次GC時每類對象的重用價值,累加得到最后的結(jié)果。

圖1中給出的方法,在Java虛擬機加載新的類或者內(nèi)存垃圾收集器中發(fā)生“新增對象”、“開始GC”、“標記到存活對象”、“結(jié)束GC”等事件時均可被反復(fù)觸發(fā)。

圖1中,“開始”表示本發(fā)明在虛擬機中開始工作。

第一步,判斷JVM“是否加載新類”,如果“是”,則在Sspace中為其分配一個對應(yīng)的Sstruct,并將對應(yīng)的Sstruct初始化,如圖2所示,完成后結(jié)束本方法對本次觸發(fā)事件的處理;如果“否”,則繼續(xù)下一步判斷。

第二步,將判斷內(nèi)存垃圾收集器“是否新增對象”,如果“是”,則修改對應(yīng)的Sstruct中的A值,如圖3所示,完成后結(jié)束本方法對本次觸發(fā)事件的處理;如果“否”,則繼續(xù)下一步判斷。

第三步,將判斷內(nèi)存垃圾收集器“是否GC”,如果“是”,則計算所有Sstruct上次GC后每個對象的重用價值v,將值累加至V上,然后清零O值,完成后結(jié)束本方法對本次觸發(fā)事件的處理;如果“否”,則繼續(xù)下一步判斷。

對于某類對象,v的計算公式如下:

<mrow> <mi>v</mi> <mo>=</mo> <mfrac> <mrow> <mi>B</mi> <mo>+</mo> <mi>O</mi> <mo>+</mo> <mi>A</mi> </mrow> <mn>3</mn> </mfrac> <mo>&times;</mo> <mfrac> <mrow> <mi>a</mi> <mi>t</mi> <mi>a</mi> <mi>n</mi> <mrow> <mo>(</mo> <mi>A</mi> <mo>-</mo> <mi>O</mi> <mo>)</mo> </mrow> </mrow> <mrow> <mi>B</mi> <mo>-</mo> <mi>O</mi> </mrow> </mfrac> <mo>&times;</mo> <mfrac> <mn>2</mn> <mi>&pi;</mi> </mfrac> </mrow>

其中,atan為反正切函數(shù)。

第四步,將判斷內(nèi)存垃圾收集器“是否標記到存活對象”,如果“是”,則修改對應(yīng)的Sstruct中的O值,如圖5所示,完成后結(jié)束本方法對本次觸發(fā)事件的處理;如果“否”,則繼續(xù)下一步判斷。

第五步,將判斷內(nèi)存垃圾收集器“是否結(jié)束GC”,如果“是”,則對所有的Sstruct進行清理,在每個Sstruct中,將A值賦給B,O值賦給A,完成后結(jié)束本方法對本次觸發(fā)事件的處理;如果“否”,則繼續(xù)下一步判斷。

“結(jié)束”表示結(jié)束本方法對本次觸發(fā)事件的處理。

圖2展示的是本地修改的數(shù)據(jù)結(jié)構(gòu)和新增的數(shù)據(jù)結(jié)構(gòu)。在程序運行時,在內(nèi)存中開辟一個空間Sspace用于存放程序需要統(tǒng)計的信息。在Sspace中,對每個Java類都利用一個數(shù)據(jù)結(jié)構(gòu)Sstruct存儲統(tǒng)計信息。

需要修改JVM的類加載器ClassLoader,在加載一個類的時候,在方法區(qū)為每個類的類信息新增一個指針P,為該類在Sspace中分配如圖2所示的額外數(shù)據(jù)結(jié)構(gòu)Sstruct,將P指向該類對象運行時統(tǒng)計的數(shù)據(jù)結(jié)構(gòu)Sstruct。在Sstruct初始化時,將V、B、O、A均置為0,將R指向類信息在方法區(qū)的地址。

在一個類的Sstruct數(shù)據(jù)結(jié)構(gòu)中,V存儲的是該類對象的重用價值,O代表的是執(zhí)行完上次GC之后該類對象存活的個數(shù),B代表的上次GC前該類對象的個數(shù),A代表的是在本次GC前該類對象的個數(shù)。指針R指向該類在方法區(qū)的類信息。

圖3展示了新分配一個對象時需要處理的部分。當(dāng)Java虛擬機執(zhí)行到一個NEW指令時,通過該對象的類型,取到該類的統(tǒng)計數(shù)據(jù)的結(jié)構(gòu)體Sstruct的地址,將結(jié)構(gòu)體Sstruct中的數(shù)據(jù)A加一即可,說明在下次GC發(fā)生之前,該類對象的個數(shù)增加了一個。

圖4展示的是本地程序統(tǒng)計分析可重用對象價值的基本分析方法。程序運行時經(jīng)過GC后,被垃圾回收收集的對象,如果在下次GC之前相同類型的對象又需要申請分配內(nèi)存,那么這種對象的內(nèi)存就可以被反復(fù)的利用。減少因為垃圾回收所帶來的性能損失。

例如,在一次執(zhí)行GC前,類D的存活對象有n個,類D的存活對象簡稱為對象D,執(zhí)行完GC后對象D還剩a個,到下次執(zhí)行GC前對象D又變?yōu)閤個。對于一個類而言,如果對象的個數(shù)越多,那么該類對象的可重用價值就越高。并且,如果n比a大并且小于等于x時,該對象D進行重用會取得較好的效果。因此計算一個對象在一次GC時的重用價值時,可以采取如下的公式:

<mrow> <mi>v</mi> <mi>a</mi> <mi>l</mi> <mi>u</mi> <mi>e</mi> <mrow> <mo>(</mo> <mi>D</mi> <mo>)</mo> </mrow> <mo>=</mo> <mfrac> <mrow> <mi>n</mi> <mo>+</mo> <mi>a</mi> <mo>+</mo> <mi>x</mi> </mrow> <mn>3</mn> </mfrac> <mo>&times;</mo> <mfrac> <mrow> <mi>a</mi> <mi>t</mi> <mi>a</mi> <mi>n</mi> <mrow> <mo>(</mo> <mi>x</mi> <mo>-</mo> <mi>a</mi> <mo>)</mo> </mrow> </mrow> <mrow> <mi>n</mi> <mo>-</mo> <mi>a</mi> </mrow> </mfrac> <mo>&times;</mo> <mfrac> <mn>2</mn> <mi>&pi;</mi> </mfrac> </mrow>

因此,在每次開始GC時,可以計算上次GC發(fā)生時的各個類型對象重用價值并將該值加至對應(yīng)的V值上面。

圖4中的對象E是類E的存活對象,對象F是類F的存活對象,同理,可計算在本次GC時每類對象的重用價值,對象E和對象F的重用價值分別為:

<mrow> <mi>v</mi> <mi>a</mi> <mi>l</mi> <mi>u</mi> <mi>e</mi> <mrow> <mo>(</mo> <mi>E</mi> <mo>)</mo> </mrow> <mo>=</mo> <mfrac> <mrow> <mi>m</mi> <mo>+</mo> <mi>b</mi> <mo>+</mo> <mi>y</mi> </mrow> <mn>3</mn> </mfrac> <mo>&times;</mo> <mfrac> <mrow> <mi>a</mi> <mi>t</mi> <mi>a</mi> <mi>n</mi> <mrow> <mo>(</mo> <mi>y</mi> <mo>-</mo> <mi>b</mi> <mo>)</mo> </mrow> </mrow> <mrow> <mi>m</mi> <mo>-</mo> <mi>b</mi> </mrow> </mfrac> <mo>&times;</mo> <mfrac> <mn>2</mn> <mi>&pi;</mi> </mfrac> <mo>;</mo> <mi>v</mi> <mi>a</mi> <mi>l</mi> <mi>u</mi> <mi>e</mi> <mrow> <mo>(</mo> <mi>F</mi> <mo>)</mo> </mrow> <mo>=</mo> <mfrac> <mrow> <mi>t</mi> <mo>+</mo> <mi>c</mi> <mo>+</mo> <mi>z</mi> </mrow> <mn>3</mn> </mfrac> <mo>&times;</mo> <mfrac> <mrow> <mi>a</mi> <mi>t</mi> <mi>a</mi> <mi>n</mi> <mrow> <mo>(</mo> <mi>z</mi> <mo>-</mo> <mi>c</mi> <mo>)</mo> </mrow> </mrow> <mrow> <mi>t</mi> <mo>-</mo> <mi>c</mi> </mrow> </mfrac> <mo>&times;</mo> <mfrac> <mn>2</mn> <mi>&pi;</mi> </mfrac> <mo>;</mo> </mrow>

將得到的value(E)、value(F)加至對應(yīng)的V值上面。

圖5展示的是垃圾回收時的示意圖。在進行垃圾回收時,先清零Sspace中所有Sstruct中的O值,然后每次標記到存活對象時,就將該對象對應(yīng)的數(shù)據(jù)結(jié)構(gòu)Sstruct中的O值加一即可。

當(dāng)本次垃圾回收結(jié)束之后,每類對象的O值表示了現(xiàn)在存活的對象的個數(shù)。須將Sstruct中A值賦給B,表示上次GC之后的個數(shù)是本次GC之前的個數(shù)。再將O值賦給A,代表本次GC之后的對象個數(shù)為O,等待有NEW指令時再增加A值。

在程序運行結(jié)束后,將Sspace中的數(shù)據(jù)導(dǎo)出,并根據(jù)每個數(shù)據(jù)的指針R能夠?qū)С鲈摂?shù)據(jù)對應(yīng)的對象的詳細信息。這時,調(diào)用排序算法,即可分析出在程序運行過程中可重用的價值較高的對象。

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