Nitpicking. int << int then casting to long makes me uncomfortable.
doc improvement
this check is harmful.

remoteCapability.supportsPrefetch() is there to tell us if this side can call the fetch3 on the other side. Regardless of what the other side advertised, this side has already advertised the pre-fetch capability. So if the other side holds us to it, then we must deliver.
Prefetched class needs to be delivered to the classloader that's supposed to load it.

Imagine two classloaders P and C on the other side, where C delegates some of its classloading to P. On this side we got two remote classloaders Rp and Rc representing P and C respectively.

Now, imagine our loading Cc1 from Rc. Now, Cc1 actually depends on Cp1 that's loaded by P.

As a result of fetch3, we get [(Cc1,oid_Rc),(Cp1,oid_Rp)] as a return value. If we don't tell (Cp1,oid_Rp) to Rp, then someone trying to load Cp1 independently will not benefit from this prefetching. Therefore, we need to pass them to Rp eagerly.

(We still have to keep (Cp1,oid_Rp) in Rc as well so that Rp.loadClass(Cp1) will find what class file to load by which classloader.)

Note that the code behind "channel.importedClassLoaders.get(id)" seems awefully inefficient, as it creates a proxy only to look up a key. This probably needs to be improved.