public static void logThreadInfo(Logger log, String title, long minInterval) {
    boolean dumpStack = false;
    if (log.isInfoEnabled()) {
      synchronized (ReflectionUtils.class) {
        long now = EnvironmentEdgeManager.currentTime();
        if (now - previousLogTime >= minInterval * 1000) {
          previousLogTime = now;
          dumpStack = true;
        }
      }
      if (dumpStack) {
        try {
          ByteArrayOutputStream buffer = new ByteArrayOutputStream();
          printThreadInfo(new PrintStream(buffer, false, "UTF-8"), title);
          log.info(buffer.toString(Charset.defaultCharset().name()));
        } catch (UnsupportedEncodingException ignored) {
          log.warn(
            "Could not write thread info about '" + title + "' due to a string encoding issue.");
        }
      }
    }
  }
Log the current thread stacks at INFO level.
@param log         the logger that logs the stack trace
@param title       a descriptive title for the call stacks
@param minInterval the minimum time from the last
hbase-common/src/main/java/org/apache/hadoop/hbase/util/ReflectionUtils.java