001/* 002 * This file is part of the Jikes RVM project (http://jikesrvm.org). 003 * 004 * This file is licensed to You under the Eclipse Public License (EPL); 005 * You may not use this file except in compliance with the License. You 006 * may obtain a copy of the License at 007 * 008 * http://www.opensource.org/licenses/eclipse-1.0.php 009 * 010 * See the COPYRIGHT.txt file distributed with this work for information 011 * regarding copyright ownership. 012 */ 013package org.mmtk.plan.concurrent.marksweep; 014 015import org.mmtk.plan.*; 016import org.mmtk.plan.concurrent.Concurrent; 017import org.mmtk.policy.MarkSweepSpace; 018import org.mmtk.policy.Space; 019import org.mmtk.utility.heap.VMRequest; 020 021import org.vmmagic.pragma.*; 022import org.vmmagic.unboxed.ObjectReference; 023 024/** 025 * This class implements the global state of a concurrent mark-sweep collector. 026 */ 027@Uninterruptible 028public class CMS extends Concurrent { 029 030 /**************************************************************************** 031 * Constants 032 */ 033 034 /**************************************************************************** 035 * Class variables 036 */ 037 038 /** 039 * 040 */ 041 public static final MarkSweepSpace msSpace = new MarkSweepSpace("ms", VMRequest.discontiguous()); 042 public static final int MARK_SWEEP = msSpace.getDescriptor(); 043 044 static { 045 msSpace.makeAllocAsMarked(); 046 smallCodeSpace.makeAllocAsMarked(); 047 nonMovingSpace.makeAllocAsMarked(); 048 } 049 050 /**************************************************************************** 051 * Instance variables 052 */ 053 054 /** 055 * 056 */ 057 public final Trace msTrace = new Trace(metaDataSpace); 058 059 /***************************************************************************** 060 * 061 * Collection 062 */ 063 064 /** 065 * {@inheritDoc} 066 */ 067 @Override 068 @Inline 069 public void collectionPhase(short phaseId) { 070 if (phaseId == PREPARE) { 071 super.collectionPhase(phaseId); 072 msTrace.prepareNonBlocking(); 073 msSpace.prepare(true); 074 return; 075 } 076 077 if (phaseId == RELEASE) { 078 msTrace.release(); 079 msSpace.release(); 080 super.collectionPhase(phaseId); 081 return; 082 } 083 084 super.collectionPhase(phaseId); 085 } 086 087 /***************************************************************************** 088 * 089 * Accounting 090 */ 091 092 /** 093 * {@inheritDoc} 094 * The superclass accounts for its spaces, we just 095 * augment this with the mark-sweep space's contribution. 096 */ 097 @Override 098 public int getPagesUsed() { 099 return (msSpace.reservedPages() + super.getPagesUsed()); 100 } 101 102 @Override 103 public boolean willNeverMove(ObjectReference object) { 104 if (Space.isInSpace(MARK_SWEEP, object)) 105 return true; 106 return super.willNeverMove(object); 107 } 108}