private List<MapperEstimatedJvmCost> estimateMappersMemory(List<Mapper> eMappers, InitialJvmCapacity gcCap) {
		List<MapperEstimatedJvmCost> mappersJvmCostList = new ArrayList<MapperEstimatedJvmCost>();
		
		MapperMemoryEstimator memoryEstimator = new MapperMemoryEstimator(finishedConf, newConf, gcCap);
		MapperEstimatedJvmCost jvmCost;
		
		if(isMapperConfChanged || isSplitSizeChanged || isXmxChanged || isXmsChanged) {
			//split size is changed
			if(isSplitSizeChanged) {
				Map<Integer, MapperEstimatedJvmCost> cacheJvmCost = new HashMap<Integer, MapperEstimatedJvmCost>();
				
				for(int i = 0; i < eMappers.size(); i++) {
					Mapper eMapper = eMappers.get(i);
					
					int cSplitMB = (int) (eMapper.getInput().getSplitSize() / (1024 * 1024)) ; //HDFS_BYTES_READ
					
					if(!cacheJvmCost.containsKey(cSplitMB)) {
						jvmCost = memoryEstimator.estimateJvmCost(job.getMapperList(), eMapper);	
						cacheJvmCost.put(cSplitMB, jvmCost); 
					}
					else
						jvmCost = cacheJvmCost.get(cSplitMB);
					mappersJvmCostList.add(jvmCost);
				}
			}
			
			//do not need to consider split size
			else {
				
				for(int i = 0; i < job.getMapperList().size(); i++) {
					jvmCost = memoryEstimator.estimateJvmCost(job.getMapperList().get(i), eMappers.get(i));
					mappersJvmCostList.add(jvmCost);
				}
					
			}	
				
		}
		//none mapper configuration changed
		else {
			for(int i = 0; i <job.getMapperList().size(); i++) {
				jvmCost = memoryEstimator.copyJvmCost(job.getMapperList().get(i));
				mappersJvmCostList.add(jvmCost);
			}
		}
	
		return mappersJvmCostList;
	}