org.mmtk.plan.stickyimmix
Class StickyImmix

java.lang.Object
  extended by org.mmtk.plan.Plan
      extended by org.mmtk.plan.Simple
          extended by org.mmtk.plan.StopTheWorld
              extended by org.mmtk.plan.immix.Immix
                  extended by org.mmtk.plan.stickyimmix.StickyImmix
All Implemented Interfaces:
Constants

public class StickyImmix
extends Immix

This class implements the global state of a simple sticky mark bits collector, based on an immix collector. The sticky mark bits algorithm is due to Demmers et al. (http://doi.acm.org/10.1145/96709.96735), and allows generational collection to be performed in a non-moving heap by overloading the role of mark bits to also indicate whether an object is new (nursery) or not. Thus nursery objects are identified by a bit in their header, not by where they lie within the address space. While Demmers et al. did their work in a conservative collector, here we have an exact collector, so we can use a regular write barrier, and don't need to use page protection etc.

See the PLDI'08 paper by Blackburn and McKinley for a description of the algorithm: http://doi.acm.org/10.1145/1375581.1375586

All plans make a clear distinction between global and thread-local activities, and divides global and local state into separate class hierarchies. Global activities must be synchronized, whereas no synchronization is required for thread-local activities. There is a single instance of Plan (or the appropriate sub-class), and a 1:1 mapping of PlanLocal to "kernel threads" (aka CPUs or in Jikes RVM, Processors). Thus instance methods of PlanLocal allow fast, unsychronized access to functions such as allocation and collection.

The global instance defines and manages static resources (such as memory and virtual memory resources). This mapping of threads to instances is crucial to understanding the correctness and performance properties of MMTk plans.


Field Summary
static BooleanCounter fullHeap
           
private static int lastCommittedImmixPages
          TODO: this field is unused, somebody with MMTk knowledge needs to look at it
(package private) static boolean MAJOR_GC_ONLY
          If true then we only do full heap GCs---so we're like MarkSweep (+ write barrier)
 SharedDeque modPool
          Remset pool
(package private) static boolean NURSERY_COLLECT_PLOS
          If true, then new PLOS objects are collected at each nursery GC
static int SCAN_NURSERY
           
protected static float SURVIVAL_ESTIMATE
          estimated collection yield
 
Fields inherited from class org.mmtk.plan.immix.Immix
collectWholeHeap, IMMIX, immixSpace, immixTrace, lastGCWasDefrag, nextGCWholeHeap, SCAN_DEFRAG, SCAN_IMMIX
 
Fields inherited from class org.mmtk.plan.StopTheWorld
postSanityPhase, preSanityPhase
 
Fields inherited from class org.mmtk.plan.Simple
CLOSURE, collection, collectionAttempt, COMPLETE, completeClosurePhase, FINALIZABLE, finishPhase, FORWARD, FORWARD_FINALIZABLE, FORWARD_REFS, forwardPhase, INITIATE, initPhase, PHANTOM_REFS, POST_SANITY_PLACEHOLDER, PRE_SANITY_PLACEHOLDER, PREPARE, PREPARE_STACKS, prepareStacks, refTypeClosurePhase, RELEASE, rootClosurePhase, ROOTS, SANITY_BUILD_TABLE, SANITY_CHECK_TABLE, SANITY_COPY_ROOTS, SANITY_PREPARE, SANITY_RELEASE, SANITY_ROOTS, SANITY_SET_POSTGC, SANITY_SET_PREGC, sanityBuildPhase, sanityCheckPhase, SET_COLLECTION_KIND, SOFT_REFS, STACK_ROOTS, WEAK_REFS, WEAK_TRACK_REFS
 
Fields inherited from class org.mmtk.plan.Plan
ALLOC_CODE, ALLOC_COLD_CODE, ALLOC_DEFAULT, ALLOC_GCSPY, ALLOC_HOT_CODE, ALLOC_IMMORTAL, ALLOC_LARGE_CODE, ALLOC_LOS, ALLOC_NON_MOVING, ALLOC_NON_REFERENCE, ALLOC_PRIMITIVE_LOS, ALLOC_STACK, allocationSiteCount, ALLOCATORS, concurrentWorkers, controlCollectorContext, DEFAULT_MAX_NURSERY, DEFAULT_MIN_NURSERY, DEFAULT_SITE, defaultCollectorContext, emergencyCollection, GATHER_WRITE_BARRIER_STATS, GC_PREPARE, GC_PROPER, IMMORTAL, immortalSpace, insideHarness, internalTriggeredCollection, LARGE_CODE, largeCodeSpace, lastInternalTriggeredCollection, LOS, loSpace, MAX_NON_LOS_COPY_BYTES, MAX_NON_LOS_DEFAULT_ALLOC_BYTES, MAX_NON_LOS_NONMOVING_ALLOC_BYTES, META, metaDataSpace, NEEDS_LOG_BIT_IN_HEADER, NON_MOVING, NON_PARTICIPANT, nonMovingSpace, NOT_IN_GC, parallelWorkers, pretenureThreshold, SANITY, sanityChecker, sanitySpace, SCAN_BOOT_IMAGE, SMALL_CODE, smallCodeSpace, stacksPrepared, totalTime, USE_CODE_SPACE, userTriggeredCollection, VM_SPACE, vmSpace
 
Fields inherited from interface org.mmtk.utility.Constants
ALIGNMENT_VALUE, ARRAY_ELEMENT, BITS_IN_ADDRESS, BITS_IN_BYTE, BITS_IN_CHAR, BITS_IN_INT, BITS_IN_PAGE, BITS_IN_SHORT, BITS_IN_WORD, BYTES_IN_ADDRESS, BYTES_IN_BYTE, BYTES_IN_CHAR, BYTES_IN_INT, BYTES_IN_KBYTE, BYTES_IN_MBYTE, BYTES_IN_PAGE, BYTES_IN_SHORT, BYTES_IN_WORD, CARD_MASK, CARD_META_PAGES_PER_REGION, INSTANCE_FIELD, LOG_BITS_IN_ADDRESS, LOG_BITS_IN_BYTE, LOG_BITS_IN_CHAR, LOG_BITS_IN_INT, LOG_BITS_IN_PAGE, LOG_BITS_IN_SHORT, LOG_BITS_IN_WORD, LOG_BYTES_IN_ADDRESS, LOG_BYTES_IN_ADDRESS_SPACE, LOG_BYTES_IN_BYTE, LOG_BYTES_IN_CHAR, LOG_BYTES_IN_INT, LOG_BYTES_IN_KBYTE, LOG_BYTES_IN_MBYTE, LOG_BYTES_IN_PAGE, LOG_BYTES_IN_SHORT, LOG_BYTES_IN_WORD, LOG_CARD_BYTES, LOG_CARD_GRAIN, LOG_CARD_META_BYTES, LOG_CARD_META_PAGES, LOG_CARD_META_SIZE, LOG_CARD_UNITS, LOG_MIN_ALIGNMENT, MAX_ALIGNMENT, MAX_BYTES_PADDING, MAX_INT, MIN_ALIGNMENT, MIN_INT, SUPPORT_CARD_SCANNING
 
Constructor Summary
StickyImmix()
          Constructor.
 
Method Summary
 void collectionPhase(short phaseId)
          Perform a (global) collection phase.
 boolean collectionRequired(boolean spaceFull, Space space)
          This method controls the triggering of a GC.
 void forceFullHeapCollection()
          Force the next collection to be full heap.
 int getCollectionReserve()
          Return the number of pages reserved for collection.
 boolean isCurrentGCNursery()
           
 boolean isLastGCFull()
           
 void printPreStats()
          Print pre-collection statistics.
protected  void registerSpecializedMethods()
          Register specialized methods.
protected  boolean requiresFullHeapCollection()
          Determine whether this GC should be a full heap collection.
 void userTriggeredGC()
          A user-triggered GC has been initiated.
 
Methods inherited from class org.mmtk.plan.immix.Immix
getPagesUsed, lastCollectionWasExhaustive, willNeverMove
 
Methods inherited from class org.mmtk.plan.StopTheWorld
processOptions
 
Methods inherited from class org.mmtk.plan.Simple
replacePhase, replacePlaceholderPhase, switchNurseryZeroingApproach
 
Methods inherited from class org.mmtk.plan.Plan
availableMemory, bootTimeWriteBarrier, concurrentCollectionRequired, enableAllocation, enableCollection, freeMemory, fullyBooted, gcInProgress, gcInProgressProper, getAllocationSite, getPagesAvail, getPagesReserved, getSpecializedScanClass, getTotalPages, handleUserCollectionRequest, harnessBegin, harnessEnd, insertPhaseAfter, isEmergencyCollection, isInitialized, isInternalTriggeredCollection, isUserTriggeredCollection, lastCollectionFullHeap, loadObjectReference, logPoll, notifyExit, poll, printDetailedTiming, printPostStats, printUsedPages, reservedMemory, resetCollectionTrigger, sanityExpectedRC, sanityLinearScan, setGCStatus, stacksPrepared, startGCspyServer, storeObjectReference, stressTestGCRequired, totalMemory, triggerInternalCollectionRequest, usedMemory
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

NURSERY_COLLECT_PLOS

static final boolean NURSERY_COLLECT_PLOS
If true, then new PLOS objects are collected at each nursery GC

See Also:
Constant Field Values

MAJOR_GC_ONLY

static final boolean MAJOR_GC_ONLY
If true then we only do full heap GCs---so we're like MarkSweep (+ write barrier)

See Also:
Constant Field Values

SURVIVAL_ESTIMATE

protected static final float SURVIVAL_ESTIMATE
estimated collection yield

See Also:
Constant Field Values

SCAN_NURSERY

public static int SCAN_NURSERY

lastCommittedImmixPages

private static int lastCommittedImmixPages
TODO: this field is unused, somebody with MMTk knowledge needs to look at it


fullHeap

public static BooleanCounter fullHeap

modPool

public final SharedDeque modPool
Remset pool

Constructor Detail

StickyImmix

public StickyImmix()
Constructor.

Method Detail

userTriggeredGC

public void userTriggeredGC()
A user-triggered GC has been initiated.


forceFullHeapCollection

public void forceFullHeapCollection()
Description copied from class: Plan
Force the next collection to be full heap.

Overrides:
forceFullHeapCollection in class Plan

collectionPhase

public final void collectionPhase(short phaseId)
Description copied from class: Immix
Perform a (global) collection phase.

Overrides:
collectionPhase in class Immix
Parameters:
phaseId - The unique id of the phase to perform.

collectionRequired

public final boolean collectionRequired(boolean spaceFull,
                                        Space space)
This method controls the triggering of a GC. It is called periodically during allocation. Returns true to trigger a collection.

Overrides:
collectionRequired in class Plan
Parameters:
spaceFull - Space request failed, must recover pages within 'space'.
space - TODO
Returns:
true if a collection is requested by the plan.

requiresFullHeapCollection

protected boolean requiresFullHeapCollection()
Determine whether this GC should be a full heap collection.

Returns:
True if this GC should be a full heap collection.

getCollectionReserve

public int getCollectionReserve()
Description copied from class: Immix
Return the number of pages reserved for collection.

Overrides:
getCollectionReserve in class Immix
Returns:
The number of pages reserved given the pending allocation, including space reserved for collection.

printPreStats

public void printPreStats()
Print pre-collection statistics. In this class we prefix the output indicating whether the collection was full heap or not.

Overrides:
printPreStats in class Plan

isCurrentGCNursery

public final boolean isCurrentGCNursery()
Overrides:
isCurrentGCNursery in class Plan
Returns:
Is current GC only collecting objects allocated since last GC.

isLastGCFull

public final boolean isLastGCFull()

registerSpecializedMethods

protected void registerSpecializedMethods()
Description copied from class: Plan
Register specialized methods.

Overrides:
registerSpecializedMethods in class Immix