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 */ 013 package org.mmtk.vm; 014 015 import org.mmtk.plan.TraceLocal; 016 import org.mmtk.plan.TransitiveClosure; 017 import org.mmtk.utility.Constants; 018 019 import org.vmmagic.pragma.Uninterruptible; 020 import org.vmmagic.unboxed.*; 021 022 @Uninterruptible public abstract class Scanning implements Constants { 023 /** 024 * Delegated scanning of a object, processing each pointer field 025 * encountered. 026 * 027 * @param object The object to be scanned. 028 */ 029 public abstract void scanObject(TransitiveClosure trace, ObjectReference object); 030 031 /** 032 * Invoke a specialized scan method. Note that these methods must have been allocated 033 * explicitly through Plan and PlanConstraints. 034 * 035 * @param id The specialized method id 036 * @param trace The trace the method has been specialized for 037 * @param object The object to be scanned 038 */ 039 public abstract void specializedScanObject(int id, TransitiveClosure trace, ObjectReference object); 040 041 /** 042 * Prepares for using the <code>computeAllRoots</code> method. The 043 * thread counter allows multiple GC threads to co-operatively 044 * iterate through the thread data structure (if load balancing 045 * parallel GC threads were not important, the thread counter could 046 * simply be replaced by a for loop). 047 */ 048 public abstract void resetThreadCounter(); 049 050 /** 051 * Called the first time during a collection that thread's stacks 052 * have been scanned. This can be used (for example) to clean up 053 * obsolete compiled methods that are no longer being executed. 054 */ 055 public abstract void notifyInitialThreadScanComplete(); 056 057 /** 058 * Computes static roots. This method establishes all such roots for 059 * collection and places them in the root locations queue. This method 060 * should not have side effects (such as copying or forwarding of 061 * objects). There are a number of important preconditions: 062 * 063 * <ul> 064 * <li> All objects used in the course of GC (such as the GC thread 065 * objects) need to be "pre-copied" prior to calling this method. 066 * <li> The <code>threadCounter</code> must be reset so that load 067 * balancing parallel GC can share the work of scanning threads. 068 * </ul> 069 * 070 * @param trace The trace to use for computing roots. 071 */ 072 public abstract void computeStaticRoots(TraceLocal trace); 073 074 /** 075 * Computes global roots. This method establishes all such roots for 076 * collection and places them in the root locations queue. This method 077 * should not have side effects (such as copying or forwarding of 078 * objects). There are a number of important preconditions: 079 * 080 * <ul> 081 * <li> All objects used in the course of GC (such as the GC thread 082 * objects) need to be "pre-copied" prior to calling this method. 083 * <li> The <code>threadCounter</code> must be reset so that load 084 * balancing parallel GC can share the work of scanning threads. 085 * </ul> 086 * 087 * @param trace The trace to use for computing roots. 088 */ 089 public abstract void computeGlobalRoots(TraceLocal trace); 090 091 /** 092 * Computes roots pointed to by threads, their associated registers 093 * and stacks. This method places these roots in the root values, 094 * root locations and interior root locations queues. This method 095 * should not have side effects (such as copying or forwarding of 096 * objects). There are a number of important preconditions: 097 * 098 * <ul> 099 * <li> All objects used in the course of GC (such as the GC thread 100 * objects) need to be "pre-copied" prior to calling this method. 101 * <li> The <code>threadCounter</code> must be reset so that load 102 * balancing parallel GC can share the work of scanning threads. 103 * </ul> 104 * 105 * @param trace The trace to use for computing roots. 106 */ 107 public abstract void computeThreadRoots(TraceLocal trace); 108 109 /** 110 * Compute all roots out of the VM's boot image (if any). This method is a no-op 111 * in the case where the VM does not maintain an MMTk-visible Java space. However, 112 * when the VM does maintain a space (such as a boot image) which is visible to MMTk, 113 * that space could either be scanned by MMTk as part of its transitive closure over 114 * the whole heap, or as a (considerable) performance optimization, MMTk could avoid 115 * scanning the space if it is aware of all pointers out of that space. This method 116 * is used to establish the root set out of the scannable space in the case where 117 * such a space exists. 118 * 119 * @param trace The trace object to use to report root locations. 120 */ 121 public abstract void computeBootImageRoots(TraceLocal trace); 122 }