protected void releaseReferent(SchemaPageContext cxt) {
    for (ISchemaPage p : cxt.referredPages.values()) {
      p.decrementAndGetRefCnt();
    }

    if (pageInstCache.size() > SchemaFileConfig.PAGE_CACHE_SIZE) {
      cacheLock.lock();
      try {
        for (ISchemaPage p : cxt.referredPages.values()) {
          // unnecessary to evict the page object in context by 2 case:
          //  1. it is held by another thread, e.g., RefCnt != 0
          //  2. it had already been evicted, e.g., pageCache.get(id) != page
          if (p.getRefCnt().get() == 0 && pageInstCache.get(p.getPageIndex()) == p) {
            pageInstCache.remove(p.getPageIndex());
          }
        }

        if (pageInstCache.size() <= SchemaFileConfig.PAGE_CACHE_SIZE) {
          cacheFull.signal();
        }
      } finally {
        cacheLock.unlock();
      }
    }
  }
release referents and evict likely useless page if necessary
iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/schemafile/pagemgr/PagePool.java