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 + '}'。 } } }