ScanObject.rootScan(VM_Magic.objectAsAddress(th.jniEnv.JNIRefs));
ScanObject.rootScan(VM_Magic.objectAsAddress(th.jniEnv.refsArray()));
  public static void computeAllRoots(AddressQueue rootLocations,				     AddressPairQueue interiorRootLocations) {    AddressPairQueue codeLocations = MOVES_OBJECTS ? interiorRootLocations : null;    ScanStatics.scanStatics(rootLocations);    while (true) {      int threadIndex = threadCounter.increment();      if (threadIndex >= VM_Scheduler.threads.length) break;      VM_Thread th = VM_Scheduler.threads[threadIndex];      if (th == null) continue;      // See comment of ScanThread.scanThread      //      VM_Address thAddr = VM_Magic.objectAsAddress(th);      VM_Thread th2 = VM_Magic.addressAsThread(Plan.traceObject(thAddr, true));      if (VM_Magic.objectAsAddress(th2).EQ(thAddr))	ScanObject.rootScan(thAddr);      ScanObject.rootScan(VM_Magic.objectAsAddress(th.stack));      if (th.jniEnv != null) {	ScanObject.rootScan(VM_Magic.objectAsAddress(th.jniEnv));	ScanObject.rootScan(VM_Magic.objectAsAddress(th.jniEnv.JNIRefs));      }      ScanObject.rootScan(VM_Magic.objectAsAddress(th.contextRegisters));      ScanObject.rootScan(VM_Magic.objectAsAddress(th.contextRegisters.gprs));      ScanObject.rootScan(VM_Magic.objectAsAddress(th.hardwareExceptionRegisters));      ScanObject.rootScan(VM_Magic.objectAsAddress(th.hardwareExceptionRegisters.gprs));      ScanThread.scanThread(th2, rootLocations, codeLocations);    }    ScanObject.rootScan(VM_Magic.objectAsAddress(VM_Scheduler.threads));    VM_CollectorThread.gcBarrier.rendezvous();  }