/** * Perform a (global) collection phase. * * @param phaseId Collection phase to execute. */ @NoInline public void collectionPhase(short phaseId) { if (phaseId == SET_COLLECTION_KIND) { super.collectionPhase(phaseId); gcFullHeap = requiresFullHeapCollection(); return; } if (phaseId == PREPARE) { nurserySpace.prepare(true); if (traceFullHeap()) { if (gcFullHeap) { if (Stats.gatheringStats()) fullHeap.set(); fullHeapTime.start(); } super.collectionPhase(phaseId); // we can throw away the remsets (but not modbuf) for a full heap GC remsetPool.clearDeque(1); arrayRemsetPool.clearDeque(2); } return; } if (phaseId == CLOSURE) { if (!traceFullHeap()) { nurseryTrace.prepare(); } return; } if (phaseId == RELEASE) { nurserySpace.release(); modbufPool.clearDeque(1); remsetPool.clearDeque(1); arrayRemsetPool.clearDeque(2); if (!traceFullHeap()) { nurseryTrace.release(); } else { super.collectionPhase(phaseId); if (gcFullHeap) fullHeapTime.stop(); } nextGCFullHeap = (getPagesAvail() < Options.nurserySize.getMinNursery()); return; } super.collectionPhase(phaseId); }
/** Register specialized methods. */ @Interruptible protected void registerSpecializedMethods() { TransitiveClosure.registerSpecializedScan(SCAN_NURSERY, GenNurseryTraceLocal.class); super.registerSpecializedMethods(); }
/** * Print pre-collection statistics. In this class we prefix the output indicating whether the * collection was full heap or not. */ public void printPreStats() { if ((Options.verbose.getValue() >= 1) && (gcFullHeap)) Log.write("[Full heap]"); super.printPreStats(); }