if (VM.VerifyAssertions) VM._assert((why >= 0) && (why < TRIGGER_REASONS));
  public static final void triggerCollection(int why)    throws VM_PragmaInterruptible {    Plan.collectionInitiated(why);    if (VM.VerifyAssertions) VM._assert((why >= 0) && (why < TRIGGER_REASONS));     if (Options.verbose >= 4) {      VM.sysWriteln("Entered VM_Interface.triggerCollection().  Stack:");      VM_Scheduler.dumpStack();    }    if ((Options.verbose == 1 || Options.verbose == 2) 	&& (why == EXTERNALLY_TRIGGERED_GC)) {      VM.sysWrite("[Forced GC]");    }    if (Options.verbose > 2) VM.sysWriteln("Collection triggered due to ", triggerReasons[why]);    double start = VM_Time.now();    VM_CollectorThread.collect(VM_CollectorThread.handshake);    double end = VM_Time.now();    double gcTime = end - start;    HeapGrowthManager.recordGCTime(gcTime);    if (Options.verbose > 2) VM.sysWriteln("Collection finished (ms): ", VM_Time.toMilliSecs(gcTime));        if (Plan.isLastGCFull()) {      boolean heapSizeChanged = false;      if (Options.variableSizeHeap && why != EXTERNALLY_TRIGGERED_GC) {	// Don't consider changing the heap size if gc was forced by System.gc()	heapSizeChanged = HeapGrowthManager.considerHeapSize();      }      HeapGrowthManager.reset();      if (!heapSizeChanged) {	checkForExhaustion(why, false);      }    } // isLastGCFull    Plan.checkForAsyncCollection();  }