private double calculateScanThreshold() {
    Optional<Integer> configuredThresholdPercent = SystemProperty
        .getProductIntegerProperty(SystemPropertyHelper.EVICTION_SCAN_THRESHOLD_PERCENT);

    int thresholdPercent =
        configuredThresholdPercent.orElse(DEFAULT_EVICTION_SCAN_THRESHOLD_PERCENT);
    if (thresholdPercent < 0 || thresholdPercent > 100) {
      thresholdPercent = DEFAULT_EVICTION_SCAN_THRESHOLD_PERCENT;
    }

    return (double) thresholdPercent / 100;
  }
LRUListWithAsyncSorting holds the eviction list, and the behavior for maintaining the list and
determining the next entry to be removed. Each EntriesMap that supports LRU holds one of these.
Evicts are always done from the head and assume that it is the least recent entry unless if is
being used by a transaction or is already evicted in which case it is removed from the list and
the next item is evicted. Adds are always done to the end of the list and should not be marked
recently used. An async scanner runs periodically (how often TBD), head to tail, removing entries
that have been recently used, marking them as not recently used, and adding them back to the
tail. Removes may unlink entries from the list.
geode-core/src/main/java/org/apache/geode/internal/cache/eviction/LRUListWithAsyncSorting.java