From dd3dfedf81930099f5bc7595806fe9956c6936eb Mon Sep 17 00:00:00 2001 From: Simon Ogorodnik Date: Tue, 2 Apr 2019 15:45:26 +0300 Subject: [PATCH] KT-30688: Fix memory leak on module in disposer after onTooComplexChange Remove explicit cache entry removal, use weak map instead #KT-30688 fixed --- .../kotlin/idea/caches/PerModulePackageCacheService.kt | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/PerModulePackageCacheService.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/PerModulePackageCacheService.kt index c20d3887228..53c5279f41c 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/PerModulePackageCacheService.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/PerModulePackageCacheService.kt @@ -17,7 +17,6 @@ import com.intellij.openapi.project.Project import com.intellij.openapi.project.rootManager import com.intellij.openapi.roots.ModuleRootEvent import com.intellij.openapi.roots.ModuleRootListener -import com.intellij.openapi.util.Disposer import com.intellij.openapi.util.Key import com.intellij.openapi.vfs.VfsUtilCore import com.intellij.openapi.vfs.VirtualFile @@ -219,10 +218,9 @@ class ImplicitPackagePrefixCache(private val project: Project) { class PerModulePackageCacheService(private val project: Project) { /* - * Disposal of entries handled by Module child Disposable registered in packageExists - * Actually an StrongMap>> + * Actually an WeakMap>> */ - private val cache = ConcurrentHashMap>>() + private val cache = ContainerUtil.createConcurrentWeakMap>>() private val implicitPackagePrefixCache = ImplicitPackagePrefixCache(project) private val pendingVFileChanges: MutableSet = mutableSetOf() @@ -323,7 +321,6 @@ class PerModulePackageCacheService(private val project: Project) { checkPendingChanges() val perSourceInfoCache = cache.getOrPut(module) { - Disposer.register(module, Disposable { cache.remove(module) }) ContainerUtil.createConcurrentSoftMap() } val cacheForCurrentModuleInfo = perSourceInfoCache.getOrPut(moduleInfo) {