final Page putPage(int oid) {
		synchronized (objectCache) {
			long pos = getPos(oid);

			if ((pos & (dbFreeHandleFlag | dbPageObjectFlag)) != dbPageObjectFlag) {
				throw new StorageError(StorageError.DELETED_OBJECT);
			}

			if ((pos & dbModifiedFlag) == 0) {
				dirtyPagesMap[oid >>> (dbHandlesPerPageBits + 5)] |= 1 << ((oid >>> dbHandlesPerPageBits) & 31);
				allocate(Page.pageSize, oid);
				cloneBitmap(pos & ~dbFlagsMask, Page.pageSize);
				pos = getPos(oid);
			}

			modified = true;

			return pool.putPage(pos & ~dbFlagsMask);
		}
	}