private List<ReducerEstimatedJvmCost> estimateReducersMemory(List<Reducer> eReducers, InitialJvmCapacity gcCap) {
			
		int fReducerNum = finishedConf.getMapred_reduce_tasks();

		if(fReducerNum == 0)
			return null;
		
		List<ReducerEstimatedJvmCost> reducersJvmCostList = new ArrayList<ReducerEstimatedJvmCost>();
		ReducerMemoryEstimator memoryEstimator = new ReducerMemoryEstimator(finishedConf, newConf, gcCap);
		
		ReducerEstimatedJvmCost jvmCost;
		//reducer number doesn't change
		if(fReducerNum == newConf.getMapred_reduce_tasks()) {
			for(int i = 0; i < fReducerNum; i++) {
				//use the corresponding finished reducer to estimate the new reducer
				//if input data is changed, this model needs modification
				//currently, this model assumes the total input data is as same as the finished one
				jvmCost = memoryEstimator.esimateJvmCost(job.getReducerList().get(i), eReducers.get(i));
				reducersJvmCostList.add(jvmCost);
			}
		}
		//reducer number changes
		else {
			for(int i = 0; i < newConf.getMapred_reduce_tasks(); i++) {
				//use all the finished reducers' infos to estimate the new reducer
				jvmCost = memoryEstimator.esimateJvmCost(job.getReducerList(), eReducers.get(i));
				reducersJvmCostList.add(jvmCost);
			}
		}	
		
		return reducersJvmCostList;
	}