What do you think about replacing the concurrent map usage with something like AtomicLongArray? So the core logic would be something like:

AtomicLongArray counts = new AtomicLongArray(numBuckets)

void increment(long amount) {
  long now = System.currentTimeMillis() / 1000L;
  int i = now % numBuckets
  counts.addAndGet(i, amount);
}

Long getAndResetValue() {
  // swap counts array that is currently being used
  // scan and return max
}

This approach would make the increment much cheaper, just get time and increment atomic long. The main disadvantage is that the number of buckets needs to be sized appropriately for the expected polling interval. Otherwise we will roll over for the index and overwrite a previous count. I think this is acceptable as long as we allow the user to specify the number of buckets when creating the counter.