From 5fbb41bf86041f7bb8b0cf2c1e7c689a7d5668e7 Mon Sep 17 00:00:00 2001 From: Alexey Tsvetkov Date: Sat, 27 May 2017 23:38:08 +0300 Subject: [PATCH] Stabilize test of Gradle's daemon for memory leaks We need to wait for GC to finish, because GC can be concurrent --- .../gradle/plugin/KotlinGradleBuildServices.kt | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinGradleBuildServices.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinGradleBuildServices.kt index 891990b4ebd..8d741f3e2c7 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinGradleBuildServices.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinGradleBuildServices.kt @@ -31,7 +31,11 @@ import org.jetbrains.kotlin.incremental.BuildCacheStorage import org.jetbrains.kotlin.incremental.multiproject.ArtifactDifferenceRegistryProvider import org.jetbrains.kotlin.incremental.relativeToRoot import org.jetbrains.kotlin.incremental.stackTraceStr +import org.jetbrains.kotlin.utils.addToStdlib.sumByLong import java.io.File +import java.lang.management.ManagementFactory + + internal class KotlinGradleBuildServices private constructor(gradle: Gradle): BuildAdapter() { companion object { @@ -164,12 +168,16 @@ internal class KotlinGradleBuildServices private constructor(gradle: Gradle): Bu if (!shouldReportMemoryUsage) return null log.lifecycle(FORCE_SYSTEM_GC_MESSAGE) + val gcCountBefore = getGcCount() System.gc() - System.runFinalization() - System.gc() + while (getGcCount() == gcCountBefore) {} + val rt = Runtime.getRuntime() return (rt.totalMemory() - rt.freeMemory()) / 1024 } + + private fun getGcCount(): Long = + ManagementFactory.getGarbageCollectorMXBeans().sumByLong { Math.max(0, it.collectionCount) } }