joeq.Allocator
Class SimpleAllocator

java.lang.Object
  extended by joeq.Allocator.HeapAllocator
      extended by joeq.Allocator.SimpleAllocator
All Implemented Interfaces:
jq_ClassFileConstants

public class SimpleAllocator
extends HeapAllocator

SimpleAllocator is a simple version of a heap allocator. It is basically a bump-pointer allocator with a free list.

Version:
$Id: SimpleAllocator.java,v 1.46 2005/01/21 07:13:15 joewhaley Exp $
Author:
John Whaley

Nested Class Summary
 
Nested classes/interfaces inherited from class joeq.Allocator.HeapAllocator
HeapAllocator.HeapPointer
 
Field Summary
static jq_InstanceMethod _allocateArray
           
static jq_InstanceMethod _allocateArrayAlign8
           
static jq_InstanceMethod _allocateObject
           
static jq_InstanceMethod _allocateObjectAlign8
           
static jq_Class _class
           
static int BLOCK_SIZE
          Size of blocks allocated from the OS.
static int LARGE_THRESHOLD
          Threshold for direct OS allocation.
static int MAX_MEMORY
          Maximum memory, in bytes, to be allocated from the OS.
static int MIN_SIZE
          Smallest object size allowed in free list.
static boolean NO_GC
           
static boolean TRACE_ALLOC
           
static boolean TRACE_FREELIST
           
static boolean TRACE_GC
           
 
Fields inherited from class joeq.Allocator.HeapAllocator
_clsinitAndAllocateObject, _data_segment_end, _data_segment_start, data_segment_end, data_segment_start, TRACE
 
Fields inherited from interface joeq.Class.jq_ClassFileConstants
ACC_ABSTRACT, ACC_FINAL, ACC_INTERFACE, ACC_NATIVE, ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC, ACC_STATIC, ACC_STRICT, ACC_SUPER, ACC_SYNCHRONIZED, ACC_TRANSIENT, ACC_VOLATILE, CONSTANT_Class, CONSTANT_Double, CONSTANT_FieldRef, CONSTANT_Float, CONSTANT_Integer, CONSTANT_InterfaceMethodRef, CONSTANT_Long, CONSTANT_MethodRef, CONSTANT_NameAndType, CONSTANT_ResolvedClass, CONSTANT_ResolvedIFieldRef, CONSTANT_ResolvedIMethodRef, CONSTANT_ResolvedSFieldRef, CONSTANT_ResolvedSMethodRef, CONSTANT_String, CONSTANT_Utf8, CONSUME_STACK, ILLEGAL_OPCODE, ILLEGAL_TYPE, jbc_AALOAD, jbc_AASTORE, jbc_ACONST_NULL, jbc_ALOAD, jbc_ALOAD_0, jbc_ALOAD_1, jbc_ALOAD_2, jbc_ALOAD_3, jbc_ANEWARRAY, jbc_ARETURN, jbc_ARRAYLENGTH, jbc_ASTORE, jbc_ASTORE_0, jbc_ASTORE_1, jbc_ASTORE_2, jbc_ASTORE_3, jbc_ATHROW, jbc_BALOAD, jbc_BASTORE, jbc_BIPUSH, jbc_BREAKPOINT, jbc_CALOAD, jbc_CASTORE, jbc_CHECKCAST, jbc_D2F, jbc_D2I, jbc_D2L, jbc_DADD, jbc_DALOAD, jbc_DASTORE, jbc_DCMPG, jbc_DCMPL, jbc_DCONST_0, jbc_DCONST_1, jbc_DDIV, jbc_DLOAD, jbc_DLOAD_0, jbc_DLOAD_1, jbc_DLOAD_2, jbc_DLOAD_3, jbc_DMUL, jbc_DNEG, jbc_DREM, jbc_DRETURN, jbc_DSTORE, jbc_DSTORE_0, jbc_DSTORE_1, jbc_DSTORE_2, jbc_DSTORE_3, jbc_DSUB, jbc_DUP, jbc_DUP_X1, jbc_DUP_X2, jbc_DUP2, jbc_DUP2_X1, jbc_DUP2_X2, jbc_F2D, jbc_F2I, jbc_F2L, jbc_FADD, jbc_FALOAD, jbc_FASTORE, jbc_FCMPG, jbc_FCMPL, jbc_FCONST_0, jbc_FCONST_1, jbc_FCONST_2, jbc_FDIV, jbc_FLOAD, jbc_FLOAD_0, jbc_FLOAD_1, jbc_FLOAD_2, jbc_FLOAD_3, jbc_FMUL, jbc_FNEG, jbc_FREM, jbc_FRETURN, jbc_FSTORE, jbc_FSTORE_0, jbc_FSTORE_1, jbc_FSTORE_2, jbc_FSTORE_3, jbc_FSUB, jbc_GETFIELD, jbc_GETSTATIC, jbc_GOTO, jbc_GOTO_W, jbc_I2B, jbc_I2C, jbc_I2D, jbc_I2F, jbc_I2L, jbc_I2S, jbc_IADD, jbc_IALOAD, jbc_IAND, jbc_IASTORE, jbc_ICONST_0, jbc_ICONST_1, jbc_ICONST_2, jbc_ICONST_3, jbc_ICONST_4, jbc_ICONST_5, jbc_ICONST_M1, jbc_IDIV, jbc_IF_ACMPEQ, jbc_IF_ACMPNE, jbc_IF_ICMPEQ, jbc_IF_ICMPGE, jbc_IF_ICMPGT, jbc_IF_ICMPLE, jbc_IF_ICMPLT, jbc_IF_ICMPNE, jbc_IFEQ, jbc_IFGE, jbc_IFGT, jbc_IFLE, jbc_IFLT, jbc_IFNE, jbc_IFNONNULL, jbc_IFNULL, jbc_IINC, jbc_ILOAD, jbc_ILOAD_0, jbc_ILOAD_1, jbc_ILOAD_2, jbc_ILOAD_3, jbc_IMUL, jbc_INEG, jbc_INSTANCEOF, jbc_INT2BYTE, jbc_INT2CHAR, jbc_INT2SHORT, jbc_INVOKEINTERFACE, jbc_INVOKENONVIRTUAL, jbc_INVOKESPECIAL, jbc_INVOKESTATIC, jbc_INVOKEVIRTUAL, jbc_IOR, jbc_IREM, jbc_IRETURN, jbc_ISHL, jbc_ISHR, jbc_ISTORE, jbc_ISTORE_0, jbc_ISTORE_1, jbc_ISTORE_2, jbc_ISTORE_3, jbc_ISUB, jbc_IUSHR, jbc_IXOR, jbc_JSR, jbc_JSR_W, jbc_L2D, jbc_L2F, jbc_L2I, jbc_LADD, jbc_LALOAD, jbc_LAND, jbc_LASTORE, jbc_LCMP, jbc_LCONST_0, jbc_LCONST_1, jbc_LDC, jbc_LDC_W, jbc_LDC2_W, jbc_LDIV, jbc_LLOAD, jbc_LLOAD_0, jbc_LLOAD_1, jbc_LLOAD_2, jbc_LLOAD_3, jbc_LMUL, jbc_LNEG, jbc_LOOKUPSWITCH, jbc_LOR, jbc_LREM, jbc_LRETURN, jbc_LSHL, jbc_LSHR, jbc_LSTORE, jbc_LSTORE_0, jbc_LSTORE_1, jbc_LSTORE_2, jbc_LSTORE_3, jbc_LSUB, jbc_LUSHR, jbc_LXOR, jbc_MONITORENTER, jbc_MONITOREXIT, jbc_MULTIANEWARRAY, jbc_NEW, jbc_NEWARRAY, jbc_NOP, jbc_POP, jbc_POP2, jbc_PUTFIELD, jbc_PUTSTATIC, jbc_RET, jbc_RETURN, jbc_SALOAD, jbc_SASTORE, jbc_SIPUSH, jbc_SWAP, jbc_TABLESWITCH, jbc_WIDE, NO_OF_OPERANDS, OPCODE_NAMES, PRODUCE_STACK, RESERVED, STATE_CLSINITERROR, STATE_CLSINITIALIZED, STATE_CLSINITIALIZING, STATE_CLSINITRUNNING, STATE_COMPILED, STATE_COMPILING, STATE_LOADED, STATE_LOADERROR, STATE_LOADING1, STATE_LOADING2, STATE_LOADING3, STATE_PREPARED, STATE_PREPARING, STATE_SFINITIALIZED, STATE_SFINITIALIZING, STATE_UNLOADED, STATE_VERIFIED, STATE_VERIFYING, T_BOOLEAN, T_BYTE, T_CHAR, T_DOUBLE, T_FLOAT, T_INT, T_LONG, T_SHORT, TC_ARRAY, TC_BOOLEAN, TC_BYTE, TC_CHAR, TC_CLASS, TC_CLASSEND, TC_DOUBLE, TC_FLOAT, TC_INT, TC_LONG, TC_PARAM, TC_PARAMEND, TC_SHORT, TC_VOID, TYPE_OF_OPERANDS, UNDEFINED, UNPREDICTABLE
 
Constructor Summary
SimpleAllocator()
           
 
Method Summary
 Object allocateArray(int length, int size, Object vtable)
          Allocate an array with the default alignment.
 Object allocateArrayAlign8(int length, int size, Object vtable)
          Allocate an array such that the elements are 8-byte aligned.
 Object allocateObject(int size, Object vtable)
          Allocate an object with the default alignment.
 Object allocateObjectAlign8(int size, Object vtable)
          Allocate an object such that the first field is 8-byte aligned.
 void collect()
          Initiate a garbage collection.
 int freeMemory()
          Returns an estimate of the amount of free memory available.
static int getObjectSize(Object o)
           
 void init()
          Perform initialization for this allocator.
 boolean isInHeap(Address a)
          Returns whether the given address falls within the boundaries of this heap.
 void processObjectReference(Address a)
          Process a reference to a heap object during garbage collection.
 void processPossibleObjectReference(Address a)
          Process a possible reference to a heap object during garbage collection.
 void sweep()
           
 int totalMemory()
          Returns an estimate of the total memory allocated (both used and unused).
 
Methods inherited from class joeq.Allocator.HeapAllocator
checkObjectReferences, clone, clsinitAndAllocateObject, getGCBit, getScalarObjectReferenceOffsets, initializeDataSegment, isInDataSegment, isObjectAssignableType, isObjectExactType, isValidArray, isValidArray, isValidArrayType, isValidArrayVTable, isValidHeapAddress, isValidObject, isValidObject, isValidReferenceType, isValidVTable, outOfMemory, setGCBit
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

NO_GC

public static boolean NO_GC

TRACE_ALLOC

public static boolean TRACE_ALLOC

TRACE_FREELIST

public static boolean TRACE_FREELIST

TRACE_GC

public static boolean TRACE_GC

BLOCK_SIZE

public static final int BLOCK_SIZE
Size of blocks allocated from the OS.

See Also:
Constant Field Values

MAX_MEMORY

public static int MAX_MEMORY
Maximum memory, in bytes, to be allocated from the OS.


LARGE_THRESHOLD

public static final int LARGE_THRESHOLD
Threshold for direct OS allocation. When an array overflows the current block and is larger than this size, it is allocated directly from the OS.

See Also:
Constant Field Values

MIN_SIZE

public static final int MIN_SIZE
Smallest object size allowed in free list.


_class

public static final jq_Class _class

_allocateObject

public static final jq_InstanceMethod _allocateObject

_allocateObjectAlign8

public static final jq_InstanceMethod _allocateObjectAlign8

_allocateArray

public static final jq_InstanceMethod _allocateArray

_allocateArrayAlign8

public static final jq_InstanceMethod _allocateArrayAlign8
Constructor Detail

SimpleAllocator

public SimpleAllocator()
Method Detail

init

public void init()
          throws OutOfMemoryError
Perform initialization for this allocator. This will be called before any other methods. This allocates an initial block of memory from the OS and sets up relevant pointers.

Specified by:
init in class HeapAllocator
Throws:
OutOfMemoryError - if there is not enough memory for initialization

freeMemory

public int freeMemory()
Returns an estimate of the amount of free memory available.

Specified by:
freeMemory in class HeapAllocator
Returns:
bytes of free memory

totalMemory

public int totalMemory()
Returns an estimate of the total memory allocated (both used and unused).

Specified by:
totalMemory in class HeapAllocator
Returns:
bytes of memory allocated

allocateObject

public Object allocateObject(int size,
                             Object vtable)
                      throws OutOfMemoryError
Allocate an object with the default alignment. If the object cannot be allocated due to lack of memory, throws OutOfMemoryError.

Specified by:
allocateObject in class HeapAllocator
Parameters:
size - size of object to allocate (including object header), in bytes
vtable - vtable pointer for new object
Returns:
new uninitialized object
Throws:
OutOfMemoryError - if there is insufficient memory to perform the operation

getObjectSize

public static final int getObjectSize(Object o)

allocateObjectAlign8

public Object allocateObjectAlign8(int size,
                                   Object vtable)
                            throws OutOfMemoryError
Allocate an object such that the first field is 8-byte aligned. If the object cannot be allocated due to lack of memory, throws OutOfMemoryError.

Specified by:
allocateObjectAlign8 in class HeapAllocator
Parameters:
size - size of object to allocate (including object header), in bytes
vtable - vtable pointer for new object
Returns:
new uninitialized object
Throws:
OutOfMemoryError - if there is insufficient memory to perform the operation

allocateArray

public Object allocateArray(int length,
                            int size,
                            Object vtable)
                     throws OutOfMemoryError,
                            NegativeArraySizeException
Allocate an array with the default alignment. If length is negative, throws NegativeArraySizeException. If the array cannot be allocated due to lack of memory, throws OutOfMemoryError.

Specified by:
allocateArray in class HeapAllocator
Parameters:
length - length of new array
size - size of array to allocate (including array header), in bytes
vtable - vtable pointer for new array
Returns:
new array
Throws:
NegativeArraySizeException - if length is negative
OutOfMemoryError - if there is insufficient memory to perform the operation

allocateArrayAlign8

public Object allocateArrayAlign8(int length,
                                  int size,
                                  Object vtable)
                           throws OutOfMemoryError,
                                  NegativeArraySizeException
Allocate an array such that the elements are 8-byte aligned. If length is negative, throws NegativeArraySizeException. If the array cannot be allocated due to lack of memory, throws OutOfMemoryError.

Specified by:
allocateArrayAlign8 in class HeapAllocator
Parameters:
length - length of new array
size - size of array to allocate (including array header), in bytes
vtable - vtable pointer for new array
Returns:
new array
Throws:
NegativeArraySizeException - if length is negative
OutOfMemoryError - if there is insufficient memory to perform the operation

collect

public void collect()
Description copied from class: HeapAllocator
Initiate a garbage collection.

Specified by:
collect in class HeapAllocator

sweep

public void sweep()

processObjectReference

public void processObjectReference(Address a)
Description copied from class: HeapAllocator
Process a reference to a heap object during garbage collection.

Specified by:
processObjectReference in class HeapAllocator

processPossibleObjectReference

public void processPossibleObjectReference(Address a)
Description copied from class: HeapAllocator
Process a possible reference to a heap object during garbage collection.

Specified by:
processPossibleObjectReference in class HeapAllocator

isInHeap

public boolean isInHeap(Address a)
Description copied from class: HeapAllocator
Returns whether the given address falls within the boundaries of this heap.

Specified by:
isInHeap in class HeapAllocator


Copyright © 2001-2005 John Whaley. All Rights Reserved.