アルゴリズムシミュレーションのJava JVM、オブジェクト到達可能性解析をトレースGCRoots

com.yh.stu.jvm.garbageパッケージ; 

。java.utilのインポートクラス*; 

/ ** 
 GCRootsを達成するために*アルゴリズム
 * 
 * DSH @author 
 * @Create 2019-08-05-15 :. 17 
 * / 
パブリッククラスGCRootsTest { 
    プライベート静的TraceTable traceTable =新しい新しいTraceTable(); 
    プライベート静的たStackFrameたStackFrame =新しい新しいザたStackFrame(); 
    プライベート静的生成newGeneration =新しい新世代(); 
    プライベート静的生成oldGeneration =新しい新世代(); 

    公共の静的な無効メイン(文字列[] args){ 
        / ** 
         *若い世代に置か万のオブジェクトは、100生き残っ
         * / 
        totalNewObjAmt INT = 10_000ファイナル。 
        (INT I = 0;私は<totalNewObjAmt; I ++が)ため、{
            =新しいObjectStorageStructure ObjectStorageStructure objSt( "#のA000 - " + I、 "A000" + I)。
            newGeneration.add(objSt)。
        } 
        / ** 
         *在老年代代放入10000个对象、存活9900个
         * / 
        最終INT totalOldObjAmt = 10_000。
        {ための式(I ++; I <totalOldObjAmt I = 0 INT) - + I + I、 "A000"、 "#1 B000")ObjectStorageStructure objSt =新しいObjectStorageStructureと、
            oldGeneration.add(objSt)。
        } 


        createRealation(newGeneration、10)。
        createRealation(oldGeneration、990)。
        System.out.print( "マイナーGCコスト:"); 
        newGeneration.gc();
        System.out.printlnは(」
        System.out.print( "メジャーGCコスト:"); 
        oldGeneration.gc(); 


    } 

    / ** 
     *随机建立对象的引用关系
     * / 
    プライベート静的ボイドcreateRealation(世代の生成は、childrenPerObjをINT){ 
        ため(INT i = 0; iは<10; iは++){ 
            ObjectStorageStructure objStRoot = getRandomObjFromGen(世代)。
            stackFrame.addAddr(objStRoot.addr)。
            用(INT J = 0; J <childrenPerObj; J ++){ 
                ObjectStorageStructure objStChild = getRandomObjFromGen(世代)。
                objStRoot.addRefObj(objStChild)。
                addTraceTable(objStRoot、objStChild)。
            } 
        } 
    } 

    プライベート静的ボイドaddTraceTable(ObjectStorageStructure objStRoot、ObjectStorageStructure objStChild){ 
        リストの<string> headList = traceTable.headMap.get(objStRoot.addr)。
        IF(headList == NULL){ 
            headList =新規のArrayList <>(); 
        } 
        headList.add(objStChild.addr)。
        traceTable.headMap.put(objStRoot.addr、headList)。
    } 

    プライベート静的ObjectStorageStructure getRandomObjFromGen(生成世代){ 
        ランダムランダム=新しいランダム(); 
        一覧<ObjectStorageStructure> objStList = generation.getObjStList();
        INT randomIndex =にRandom.nextInt(objStList.size())。
        ObjectStorageStructure objSt = objStList.get(randomIndex)。
        objStを返します。
    } 

    公共の静的な文字列getUUID(){ 
        UUID.randomUUIDを返す()toString()を。
    } 
 
    プライベート静的ボイド実行(){
        stackFrame.addAddr(UUID.randomUUID()のtoString())。
    } 

    静的クラス生成{ 
        プライベートリスト<ObjectStorageStructure> objStList =新規のArrayList <>(); 
        プライベート地図<文字列、ObjectStorageStructure>マップ=新しいHashMapの<>(); 

        公共ボイドGC(){ 
            TimerTools timerTools =新しいTimerTools()。
            timerTools.start(); 
            //复制对象、这里用睡眠(1)表示复制的时间消耗
            int型I = 1; 
            {(stackFrame.getVarAddrList()文字列rootAddr)のための
                リストの<string> addrList = traceTable.headMap.get(rootAddr)。
                (文字列childAddr:addrList)用{ 
        公共ボイド追加(ObjectStorageStructure objSt){ 
                    場合(!map.get(childAddr)= NULL){ 
                        しようと{
                            Thread.sleep(0,0)。
                        }キャッチ(InterruptedExceptionある電子){ 
                            e.printStackTrace(); 
                        } 
                        のSystem.out.println((iは++)+ " - " + map.get(childAddr))。
                    } 
                } 
            } 
            のSystem.out.println(timerTools.spent())。
        } 

            this.objStList.add(objSt)。
            this.map.put(objSt.addr、objSt)。
        } 

        パブリックリスト<ObjectStorageStructure> getObjStList(){ 
            リターンobjStList。
        } 
    } 

    静的クラスTraceTable { 
        プライベート地図<文字列、リスト<文字列>>のheadMap =新しいHashMapの(); 
    } 

    静的クラスStackFrameを{ 
        プライベートリスト<文字列> varAddrList =新しいArrayListを<>(); //存放对象引用地址

        / ** 
         *在栈帧中放入对象引用地址
         * 
         * @param addrの
         * / 
        パブリック無効addAddr(文字列ADDR){ 
            this.varAddrList.add(ADDR)。
        } 

        公共の一覧<文字列>
            varAddrListを返します。
        } 
    } 

    静的クラスObjectStorageStructure {  
        プライベート文字列ADDR、
        プライベートオブジェクトobj、
        プライベートリスト< ObjectStorageStructure> refObjList =新しいArrayListを<> (); // 参照されるオブジェクト

        公共ObjectStorageStructure(文字列ADDR、オブジェクトobj){ 
            this.addr = ADDR。
            this.obj = OBJ。
        } 

        公共ボイドaddRefObj(ObjectStorageStructure objSt){ 
            refObjList.add(objSt)。
        } 

        @Override 
        パブリック文字列のtoString(){ 
            リターン"ObjectStorageStructure {" + 
                    "ADDR =" '+ ADDR + '\'' + 
                    "OBJ =" + OBJ + 
                    '}'。
        } 
    } 

}

  

おすすめ

転載: www.cnblogs.com/csldm/p/11304682.html