if (VM_RCGC.acyclicVmClasses) VM_RootBuffer.init();
    init () {	int i, ii;	if ( ! VM.BuildForConcurrentGC ) 	    VM.sysFail("build concurrent memory manager by setting preprocessor directive RVM_WITH_CONCURRENT_GC=1");	VM_Processor st = VM_Scheduler.processors[VM_Scheduler.PRIMORDIAL_PROCESSOR_ID];	VM_CollectorThread.init();   // to alloc bootimage arrays etc	// create synchronization objects        sysLockLarge          = new VM_ProcessorLock();        sysLockSmall          = new VM_ProcessorLock();	allocated_since_lastgc = new int[GC_SIZES];	st.sizes = new VM_SizeControl[GC_SIZES];	blocks = new VM_BlockControl[GC_SIZES];	// On the jdk side, we allocate an array of VM_SizeControl Blocks, 	// one for each size.	// We also allocate blocks array within the boot image.  	// At runtime we allocate the rest of the BLOCK_CONTROLS, whose number 	// depends on the heapsize, and copy the contents of init_blocks 	// into the first GC_SIZES of them.	for (i = 0; i < GC_SIZES; i++) {	    st.sizes[i] = new VM_SizeControl();	    blocks[i] = new VM_BlockControl();	    st.sizes[i].first_block = i;	// 1 block/size initially	    st.sizes[i].current_block = i;	    st.sizes[i].ndx = i;	    // make arrays 1 entry larger: AUTO-CHECK: TAKEOUT!!	    blocks[i].Alloc1 = new byte[GC_BLOCKSIZE/GC_SIZEVALUES[i] ];	    blocks[i].Alloc2 = new byte[GC_BLOCKSIZE/GC_SIZEVALUES[i] ];	    blocks[i].alloc = blocks[i].Alloc1;	    blocks[i].mark  = blocks[i].Alloc2;	    for (ii = 0; ii < GC_BLOCKSIZE/GC_SIZEVALUES[i]; ii++) {		blocks[i].alloc[ii] = 0;		blocks[i].mark[ii]  = 0;	    }	    blocks[i].nextblock= 0;	    blocks[i].slotsize = GC_SIZEVALUES[i];	}        // set up GC_INDEX_ARRAY for this Processor        st.GC_INDEX_ARRAY = new VM_SizeControl[GC_MAX_SMALL_SIZE + 1];        st.GC_INDEX_ARRAY[0] = st.sizes[0];   // for size = 0        int j = 1;        for (i = 0; i < GC_SIZES; i++) 	    for (; j <= GC_SIZEVALUES[i]; j++) st.GC_INDEX_ARRAY[j] = st.sizes[i];	countLive   = new int[GC_SIZES];	countLargeAlloc = new int[GC_LARGE_SIZES];	countLargeLive  = new int[GC_LARGE_SIZES];        countSmallFree = new int[GC_SIZES];        countSmallBlocksAlloc = new int[GC_SIZES];	for (i = 0; i < GC_LARGE_SIZES; i++) {	    countLargeAlloc[i]   = 0;	    countLargeLive[i]    = 0;	}	for (i = 0; i < GC_SIZES; i++) {	    countLive[i]   = 0;	    allocated_since_lastgc[i]   = 0;	}        largeSpaceAlloc = new short[GC_INITIAL_LARGE_SPACE_PAGES];        for (i = 0; i < GC_INITIAL_LARGE_SPACE_PAGES; i++)	    largeSpaceAlloc[i] = 0;        large_last_allocated = 0;        largeSpacePages = GC_INITIAL_LARGE_SPACE_PAGES;	    }			// all this done in bootimagebuilder context