protected void initialize(IFile file, long pagePoolSize) {
		this.file = file;

		if (lockFile && !multiclientSupport) {
			if (!file.tryLock(readOnly)) {
				throw new StorageError(StorageError.STORAGE_IS_USED);
			}
		}

		dirtyPagesMap = new int[dbDirtyPageBitmapSize / 4 + 1];
		gcThreshold = Long.MAX_VALUE;
		backgroundGcMonitor = new Object();
		backgroundGcStartMonitor = new Object();
		gcThread = null;
		gcActive = false;
		gcDone = false;
		allocatedDelta = 0;

		reservedChain = null;
		cloneList = null;
		insideCloneBitmap = false;

		nNestedTransactions = 0;
		nBlockedTransactions = 0;
		nCommittedTransactions = 0;
		scheduledCommitTime = Long.MAX_VALUE;
		transactionMonitor = new Object();
		transactionLock = new PersistentResource();

		modified = false;

		objectCache = createObjectCache(cacheKind, pagePoolSize,
				objectCacheInitSize);

		objMap = new ObjectMap(objectCacheInitSize);

		classDescMap = new HashMap();
		descList = null;

		recursiveLoadingPolicy = new HashMap();
		recursiveLoadingPolicyDefined = false;

		header = new Header();
		pool = new PagePool((int) (pagePoolSize / Page.pageSize),
				pagePoolLruLimit);
		pool.open(file);
	}