@@ -125,13 +125,16 @@ private[spark] class Executor(
125125 threadPool.shutdown()
126126 }
127127
128+ private def gcTime = ManagementFactory .getGarbageCollectorMXBeans.map(_.getCollectionTime).sum
129+
128130 class TaskRunner (
129131 execBackend : ExecutorBackend , val taskId : Long , taskName : String , serializedTask : ByteBuffer )
130132 extends Runnable {
131133
132134 @ volatile private var killed = false
133135 @ volatile var task : Task [Any ] = _
134136 @ volatile var attemptedTask : Option [Task [Any ]] = None
137+ @ volatile var startGCTime : Long = _
135138
136139 def kill (interruptThread : Boolean ) {
137140 logInfo(s " Executor is trying to kill $taskName (TID $taskId) " )
@@ -149,8 +152,7 @@ private[spark] class Executor(
149152 logInfo(s " Running $taskName (TID $taskId) " )
150153 execBackend.statusUpdate(taskId, TaskState .RUNNING , EMPTY_BYTE_BUFFER )
151154 var taskStart : Long = 0
152- def gcTime = ManagementFactory .getGarbageCollectorMXBeans.map(_.getCollectionTime).sum
153- val startGCTime = gcTime
155+ startGCTime = gcTime
154156
155157 try {
156158 SparkEnv .set(env)
@@ -351,10 +353,13 @@ private[spark] class Executor(
351353
352354 while (! isStopped) {
353355 val tasksMetrics = new ArrayBuffer [(Long , TaskMetrics )]()
356+ val curGCTime = gcTime
357+
354358 for (taskRunner <- runningTasks.values()) {
355359 if (! taskRunner.attemptedTask.isEmpty) {
356360 Option (taskRunner.task).flatMap(_.metrics).foreach { metrics =>
357361 metrics.updateShuffleReadMetrics
362+ metrics.jvmGCTime = curGCTime - taskRunner.startGCTime
358363 if (isLocal) {
359364 // JobProgressListener will hold an reference of it during
360365 // onExecutorMetricsUpdate(), then JobProgressListener can not see
0 commit comments