diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/mapjoin/MapJoinMemoryExhaustionHandler.java ql/src/java/org/apache/hadoop/hive/ql/exec/mapjoin/MapJoinMemoryExhaustionHandler.java index 7fc3226..aa35480 100644 --- ql/src/java/org/apache/hadoop/hive/ql/exec/mapjoin/MapJoinMemoryExhaustionHandler.java +++ ql/src/java/org/apache/hadoop/hive/ql/exec/mapjoin/MapJoinMemoryExhaustionHandler.java @@ -96,7 +96,16 @@ public void checkMemoryStatus(long tableContainerSize, long numRows) + tableContainerSize + "\tMemory usage:\t" + usedMemory + "\tpercentage:\t" + percentageNumberFormat.format(percentage); console.printInfo(msg); if(percentage > maxMemoryUsage) { - throw new MapJoinMemoryExhaustionException(msg); + /** + * If consumed the configured percentage of memory, call system gc. + * If the new percentage is larger than maxMemoryUsage after that, then throw Exception. + */ + System.gc(); + usedMemory = memoryMXBean.getHeapMemoryUsage().getUsed(); + percentage = (double) usedMemory / (double) maxHeapSize; + if(percentage > maxMemoryUsage) { + throw new MapJoinMemoryExhaustionException(msg); + } } - } + } }