final void free(long pos, long size) {
		synchronized (objectCache) {
			Assert.that(pos != 0 && (pos & (dbAllocationQuantum - 1)) == 0);
			long quantNo = pos >>> dbAllocationQuantumBits;
			int objBitSize = (int) ((size + dbAllocationQuantum - 1) >>> dbAllocationQuantumBits);
			int pageId = (int) (quantNo >>> (Page.pageSizeLog + 3));
			int offs = (int) (quantNo & (Page.pageSize * 8 - 1)) >> 3;
			Page pg = putBitmapPage(pageId);
			int bitOffs = (int) quantNo & 7;

			allocatedDelta -= (long) objBitSize << dbAllocationQuantumBits;
			usedSize -= (long) objBitSize << dbAllocationQuantumBits;

			if ((pos & (Page.pageSize - 1)) == 0 && size >= Page.pageSize) {
				if (pageId == currPBitmapPage && offs < currPBitmapOffs) {
					currPBitmapOffs = offs;
				}
			}

			if (pageId == currRBitmapPage && offs < currRBitmapOffs) {
				currRBitmapOffs = offs;
			}

			bitmapPageAvailableSpace[pageId] = Integer.MAX_VALUE;

			if (objBitSize > 8 - bitOffs) {
				objBitSize -= 8 - bitOffs;
				pg.data[offs++] &= (1 << bitOffs) - 1;

				while (objBitSize + offs * 8 > Page.pageSize * 8) {
					memset(pg, offs, 0, Page.pageSize - offs);
					pool.unfix(pg);
					pg = putBitmapPage(++pageId);
					bitmapPageAvailableSpace[pageId] = Integer.MAX_VALUE;
					objBitSize -= (Page.pageSize - offs) * 8;
					offs = 0;
				}

				while ((objBitSize -= 8) > 0) {
					pg.data[offs++] = (byte) 0;
				}

				pg.data[offs] &= (byte) ~((1 << (objBitSize + 8)) - 1);
			}
			else {
				pg.data[offs] &= (byte) ~(((1 << objBitSize) - 1) << bitOffs);
			}

			pool.unfix(pg);
		}
	}