public void releaseCache() {
        if (originalThunks != null) {
            // OPTIMIZATION:
            // Rather than use the standard iterator, which creates lots of int[] arrays on the heap, which need to be GC'd,
            // we use the fast version that just mutates one array. Since this is read once for us here, this is ideal.
            Iterator<int[]> fastPassByReferenceIterator = fastPassByReferenceIterator();
            int[] assignment = fastPassByReferenceIterator.next();
            while (true) {
                setAssignmentValue(assignment, originalThunks.getAssignmentValue(assignment));

                // Set the assignment arrays correctly
                if (fastPassByReferenceIterator.hasNext()) fastPassByReferenceIterator.next();
                else break;
            }
            // Release our replicated set of original thunks
            originalThunks = null;
        }
    }
public void releaseCache ( ) { if ( originalThunks != null ) { Iterator < int [ ] > fastPassByReferenceIterator = fastPassByReferenceIterator ( ) ; int [ ] assignment = fastPassByReferenceIterator . next ( ) ; while ( true ) { setAssignmentValue ( assignment , originalThunks . getAssignmentValue ( assignment ) ) ; if ( fastPassByReferenceIterator . hasNext ( ) ) fastPassByReferenceIterator . next ( ) ; else break ; } originalThunks = null ; } }
This will release references to the cached ConcatVectors created by cacheVectors(), so that they can be cleaned
up by the GC. If no cache was constructed, this is a no-op.