private static void sweepAllTimers() {
    if (System.currentTimeMillis() < lastSweepAllTime + SWEEP_ALL_INTERVAL) {
      // Too soon.
      return;
    }
    final boolean isDebugEnabled = logger.isTraceEnabled();
    synchronized (distributedSystemTimers) {
      Iterator<Map.Entry<DistributedSystem, Set<WeakReference<SystemTimer>>>> allSystemsIterator =
          distributedSystemTimers.entrySet().iterator();
      while (allSystemsIterator.hasNext()) {
        Map.Entry<DistributedSystem, Set<WeakReference<SystemTimer>>> entry =
            allSystemsIterator.next();
        Set<WeakReference<SystemTimer>> timers = entry.getValue();
        synchronized (timers) {
          Iterator<WeakReference<SystemTimer>> timersIterator = timers.iterator();
          while (timersIterator.hasNext()) {
            WeakReference<SystemTimer> wr = timersIterator.next();
            SystemTimer st = wr.get();
            if (st == null || st.isCancelled()) {
              timersIterator.remove();
            }
          }
          if (timers.size() == 0) {
            allSystemsIterator.remove();
          }
        }
      }
    }

    // Collect time at END of sweep. It means an extra call to the system
    // timer, but makes this potentially less active.
    lastSweepAllTime = System.currentTimeMillis();
  }
Manually garbage collect {@link #distributedSystemTimers}, if it hasn't happened in a while.

@see #lastSweepAllTime
geode-core/src/main/java/org/apache/geode/internal/SystemTimer.java