docs: public T get(long duration, TimeUnit units, boolean throwException, boolean hasZF) throws InterruptedException, TimeoutException, ExecutionException {
          final long startTime = System.currentTimeMillis();
          boolean status = latch.await(duration, units);
          if (!status) {
              boolean gcPause = false;
              final RuntimeMXBean runtimeBean = ManagementFactory.getRuntimeMXBean();
              final long vmStartTime = runtimeBean.getStartTime();
              final List<GarbageCollectorMXBean> gcMXBeans = ManagementFactory.getGarbageCollectorMXBeans();
              for (GarbageCollectorMXBean gcMXBean : gcMXBeans) {
                  if (gcMXBean instanceof com.sun.management.GarbageCollectorMXBean) {
                      final GcInfo lastGcInfo = ((com.sun.management.GarbageCollectorMXBean) gcMXBean).getLastGcInfo();
  
                      // If no GCs, there was no pause due to GC.
                      if (lastGcInfo == null) {
                          continue;
                      }
  
                      final long gcStartTime = lastGcInfo.getStartTime() + vmStartTime;
                      if (gcStartTime > startTime) {
                          gcPause = true;
                          final long gcDuration = lastGcInfo.getDuration();
                          final long pauseDuration = System.currentTimeMillis() - gcStartTime;
                          if (log.isDebugEnabled()) log.debug("Total GC duration = " + gcDuration + " msec.");
                          if (log.isDebugEnabled()) log.debug("Total pause duration due to gc event = " + pauseDuration + " msec.");
                          break;
                      }
                  }
              }
              if (!gcPause && log.isDebugEnabled()) {
                  log.debug("Total pause duration due to NON-GC event = " + (System.currentTimeMillis() - startTime) + " msec.");
              }
              // redo the same op once more since there was a chance of gc pause
              status = latch.await(duration, units);
              final long pauseDuration = System.currentTimeMillis() - startTime;
              EVCacheMetricsFactory.getStatsTimer(appName, serverGroup, "Pause-get", gcPause ? "GC":"Scheduling", status ? "Succcess":"Fail").record(pauseDuration);
          }
  
          if (log.isDebugEnabled()) log.debug("Retry status : " + status);
          if (!status) {
              // whenever timeout occurs, continuous timeout counter will increase by 1.
              MemcachedConnection.opTimedOut(op);
              if (op != null) op.timeOut();
              TagList tags = null;
              if(op.getHandlingNode() instanceof EVCacheNodeImpl) {
              	tags = ((EVCacheNodeImpl)op.getHandlingNode()).getBaseTags();
              } else {
              	tags = BasicTagList.of(DataSourceType.COUNTER);
              	
              }
              if (!hasZF) EVCacheMetricsFactory.getCounter(appName, null, serverGroup.getName(), appName + "-get-CheckedOperationTimeout", tags).increment();
              if (throwException) {
                  throw new CheckedOperationTimeoutException("Timed out waiting for operation", op);
              }
          } else {
              // continuous timeout counter will be reset
              MemcachedConnection.opSucceeded(op);
          }
  
          if (op != null && op.hasErrored()) {
              if (throwException) {
                  throw new ExecutionException(op.getException());
              }
          }
          if (isCancelled()) {
              TagList tags = null;
              if(op.getHandlingNode() instanceof EVCacheNodeImpl) {
              	tags = ((EVCacheNodeImpl)op.getHandlingNode()).getBaseTags();
              } else {
              	tags = BasicTagList.of(DataSourceType.COUNTER);
              	
              }
              if (!hasZF) EVCacheMetricsFactory.getCounter(appName, null, serverGroup.getName(), appName + "-get-Cancelled", tags).increment();
              if (throwException) {
                  throw new ExecutionException(new CancellationException("Cancelled"));
              }
          }
          if (op != null && op.isTimedOut()) {
  //            if (!hasZF) EVCacheMetricsFactory.getCounter(appName, null, serverGroup.getName(), appName + "-get-Error", DataSourceType.COUNTER).increment();
              if (throwException) {
                  throw new ExecutionException(new CheckedOperationTimeoutException("Operation timed out.", op));
              }
          }
          return objRef.get();
      }