ContextCleaner是用于清理spark执行过程中内存,主要用于清理任务执行过程中生成的缓存RDD、Broadcast、Accumulator、Shuffle数据,防止造成内存压力。
ContextCleaner会在SparkContext创建过程中,被实例化:
_cleaner =
if (_conf.getBoolean("spark.cleaner.referenceTracking", true)) {
Some(new ContextCleaner(this))
} else {
None
}
_cleaner.foreach(_.start())
调用ContextCleaner的start()方法启动清理器,该类启动两个线程一个用于将清理不被使用的对象,另一个线程定时调用System.gc()方法,来清理JVM内存中不被使用的对象,该方法不会直接触发full gc,它只会建议JVM进行full gc,具体full gc何时进行由JVM自行决定。
/** Start the cleaner. */
def start(): Unit = {
cleaningThread.setDaemon(true)
cleaningThread.setName("Spark Context Cleaner")
cleaningThread.start()
periodicGCService.scheduleAtFixedRate(new Runnable {
override