blob: 479256819916db31cf1917d92f48b5969b1b651c [file] [log] [blame]
/*
* This file is part of the Jikes RVM project (http://jikesrvm.org).
*
* This file is licensed to You under the Eclipse Public License (EPL);
* You may not use this file except in compliance with the License. You
* may obtain a copy of the License at
*
* http://www.opensource.org/licenses/eclipse-1.0.php
*
* See the COPYRIGHT.txt file distributed with this work for information
* regarding copyright ownership.
*/
package org.mmtk.plan.refcount.generational;
import org.mmtk.plan.refcount.RCBase;
import org.mmtk.policy.CopySpace;
import org.mmtk.policy.Space;
import org.mmtk.utility.heap.VMRequest;
import org.mmtk.utility.options.Options;
import org.vmmagic.pragma.*;
import org.vmmagic.unboxed.ObjectReference;
/**
* This class implements the global state of a a simple reference counting collector.
*/
@Uninterruptible
public class GenRC extends RCBase {
public static final int ALLOC_NURSERY = ALLOC_DEFAULT;
public static final int ALLOC_RC = RCBase.ALLOCATORS + 1;
/** The nursery space is where all new objects are allocated by default */
public static final CopySpace nurserySpace = new CopySpace("nursery", DEFAULT_POLL_FREQUENCY, false, VMRequest.create(0.15f, true));
public static final int NURSERY = nurserySpace.getDescriptor();
/*****************************************************************************
*
* Collection
*/
/**
* Perform a (global) collection phase.
*
* @param phaseId Collection phase
*/
public final void collectionPhase(short phaseId) {
if (phaseId == PREPARE) {
nurserySpace.prepare(true);
super.collectionPhase(phaseId);
return;
}
if (phaseId == RELEASE) {
super.collectionPhase(phaseId);
nurserySpace.release();
return;
}
super.collectionPhase(phaseId);
}
/**
* This method controls the triggering of a GC. It is called periodically
* during allocation. Returns true to trigger a collection.
*
* @param spaceFull Space request failed, must recover pages within 'space'.
* @return True if a collection is requested by the plan.
*/
public final boolean collectionRequired(boolean spaceFull) {
boolean nurseryFull = nurserySpace.reservedPages() > Options.nurserySize.getMaxNursery();
return super.collectionRequired(spaceFull) || nurseryFull;
}
/*****************************************************************************
*
* Accounting
*/
/**
* Return the number of pages available for allocation, <i>assuming
* all future allocation is to the nursery</i>.
*
* @return The number of pages available for allocation, <i>assuming
* all future allocation is to the nursery</i>.
*/
public int getPagesAvail() {
return super.getPagesAvail() >> 1;
}
/**
* Return the number of pages reserved for copying.
*
* @return The number of pages reserved given the pending
* allocation, including space reserved for copying.
*/
public final int getCollectionReserve() {
return nurserySpace.reservedPages() + super.getCollectionReserve();
}
/**
* Calculate the number of pages a collection is required to free to satisfy
* outstanding allocation requests.
*
* @return the number of pages a collection is required to free to satisfy
* outstanding allocation requests.
*/
public int getPagesRequired() {
return super.getPagesRequired() + (nurserySpace.requiredPages() << 1);
}
/**
* @see org.mmtk.plan.Plan#willNeverMove
*
* @param object Object in question
* @return True if the object will never move
*/
@Override
public boolean willNeverMove(ObjectReference object) {
if (Space.isInSpace(NURSERY, object)) {
return false;
}
if (Space.isInSpace(REF_COUNT_LOS, object)) {
return true;
}
return super.willNeverMove(object);
}
}