cluster-bootstrap-api/src/main/java/com/streamsets/pipeline/hadoop/HadoopMapReduceBinding.java
public static Integer getMapMemoryMb(String javaOpts, Configuration conf) {
    String[] javaOptsArray = javaOpts.split(" ");
    Integer upperLimitMemory = null;
    for (String opts : javaOptsArray) {
      if (opts.contains("-Xmx")) {
        Integer memoryMb = Integer.valueOf(opts.substring(4, opts.length() - 1));
        switch (opts.charAt(opts.length() - 1)) {
          case 'm':
          case 'M':
            break;
          case 'k':
          case 'K':
            memoryMb = memoryMb / (1024);
            break;
          case 'g':
          case 'G':
            memoryMb = memoryMb * 1024;
            break;
          default:
            memoryMb = Integer.valueOf(opts.substring(4, opts.length())) / (1024 * 1024);
            break;
        }
        // Add 25% to Java heap as MAP_MEMORY_MB is the total physical memory for the map task
        upperLimitMemory = ((int) (memoryMb * 0.25)) + memoryMb;
        // dont break as there could be multiple -Xmx, we need to honor the last
      }
    }
    if (upperLimitMemory != null) {
      String defaultMapMemoryString = conf.get(MAPREDUCE_MAP_MEMORY_MB);
      if (defaultMapMemoryString != null) {
        Integer defaultMapMemory = Integer.valueOf(defaultMapMemoryString);
        upperLimitMemory = (upperLimitMemory > defaultMapMemory ? upperLimitMemory : defaultMapMemory);
      }
    }
    return upperLimitMemory;
  }
public static Integer getMapMemoryMb(String javaOpts, Configuration conf) {
    String[] javaOptsArray = javaOpts.split(" ");
    Integer upperLimitMemory = null;
    for (String opts : javaOptsArray) {
      if (opts.contains("-Xmx")) {
        Integer memoryMb = Integer.valueOf(opts.substring(4, opts.length() - 1));
        switch (opts.charAt(opts.length() - 1)) {
          case 'm':
          case 'M':
            break;
          case 'k':
          case 'K':
            memoryMb = memoryMb / (1024);
            break;
          case 'g':
          case 'G':
            memoryMb = memoryMb * 1024;
            break;
          default:
            memoryMb = Integer.valueOf(opts.substring(4, opts.length())) / (1024 * 1024);
            break;
        }
        // Add 25% to Java heap as MAP_MEMORY_MB is the total physical memory for the map task
        upperLimitMemory = ((int) (memoryMb * 0.25)) + memoryMb;
        // dont break as there could be multiple -Xmx, we need to honor the last
      }
    }
    if (upperLimitMemory != null) {
      String defaultMapMemoryString = conf.get(MAPREDUCE_MAP_MEMORY_MB);
      if (defaultMapMemoryString != null) {
        Integer defaultMapMemory = Integer.valueOf(defaultMapMemoryString);
        upperLimitMemory = (upperLimitMemory > defaultMapMemory ? upperLimitMemory : defaultMapMemory);
      }
    }
    return upperLimitMemory;
  }
visible for testing (can't annotate as can't depend on Guava)