@Override
  public EvictableEntry getEvictableEntry() {
    long evaluations = 0;
    EvictionNode evictionNode;
    // search for entry to return from list
    for (;;) {
      evictionNode = unlinkTailEntry();
      // end of Lifo list stop searching
      if (evictionNode == null) {
        break;
      }
      evaluations++;
      synchronized (evictionNode) {
        // if entry NOT used by transaction and NOT evicted return entry
        if (!evictionNode.isInUseByTransaction() && !evictionNode.isEvicted()) {
          break;
        }
      }
    }
    getStatistics().incEvaluations(evaluations);
    return (EvictableEntry) evictionNode;
  }
Return the Entry that is considered most recently used and available to be evicted to overflow.
Note that this implementation basically just returns the most recent thing added to the list.
So, unlike the parent class, is does no scanning based on the recentlyUsed bit. This is a
perfect implementation for our queues (gateway, client subscription) as long as they never
update something already in the queue. Since updates simply set the recentlyUsed bit then the
most recent node may be the one that was just updated and not moved to the tail of the list.
geode-core/src/main/java/org/apache/geode/internal/cache/eviction/LIFOList.java