From c70fc10cf249852804067bc2bedc4d4eee661f7e Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Mon, 25 Jun 2018 11:38:41 +0200 Subject: [PATCH] Restore broken low memory watcher functionality in JPS process; JPS: on LowMemory signal clear also FSCache --- .../src/org/jetbrains/jps/cmdline/BuildSession.java | 4 ++++ .../src/org/jetbrains/jps/incremental/IncProjectBuilder.java | 1 + .../src/org/jetbrains/jps/build/Standalone.java | 5 +++++ .../com/intellij/openapi/util/LowMemoryWatcherManager.java | 3 ++- 4 files changed, 12 insertions(+), 1 deletion(-) diff --git a/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildSession.java b/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildSession.java index f9ae93ba9e1f..76d7115a30bd 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildSession.java +++ b/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildSession.java @@ -16,6 +16,8 @@ package org.jetbrains.jps.cmdline; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.util.Disposer; +import com.intellij.openapi.util.LowMemoryWatcherManager; import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.io.BufferExposingByteArrayOutputStream; @@ -121,6 +123,7 @@ final class BuildSession implements Runnable, CanceledStatus { @Override public void run() { + final LowMemoryWatcherManager memWatcher = new LowMemoryWatcherManager(SharedThreadPool.getInstance()); Throwable error = null; final Ref hasErrors = new Ref<>(false); final Ref doneSomething = new Ref<>(false); @@ -198,6 +201,7 @@ final class BuildSession implements Runnable, CanceledStatus { } finally { finishBuild(error, hasErrors.get(), doneSomething.get()); + Disposer.dispose(memWatcher); } } diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java index 20508585f548..f12f8e3eeedf 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java @@ -170,6 +170,7 @@ public class IncProjectBuilder { public void build(CompileScope scope, boolean forceCleanCaches) throws RebuildRequestedException { final LowMemoryWatcher memWatcher = LowMemoryWatcher.register(() -> { + myProjectDescriptor.getFSCache().clear(); JavacMain.clearCompilerZipFileCache(); myProjectDescriptor.dataManager.flush(false); myProjectDescriptor.timestamps.getStorage().force(); diff --git a/jps/standalone-builder/src/org/jetbrains/jps/build/Standalone.java b/jps/standalone-builder/src/org/jetbrains/jps/build/Standalone.java index 261f4bf3ad19..de3d6d3c08ed 100644 --- a/jps/standalone-builder/src/org/jetbrains/jps/build/Standalone.java +++ b/jps/standalone-builder/src/org/jetbrains/jps/build/Standalone.java @@ -15,6 +15,8 @@ */ package org.jetbrains.jps.build; +import com.intellij.openapi.util.Disposer; +import com.intellij.openapi.util.LowMemoryWatcherManager; import com.intellij.openapi.util.io.FileUtil; import com.intellij.util.ArrayUtil; import com.intellij.util.ParameterizedRunnable; @@ -31,6 +33,7 @@ import org.jetbrains.jps.incremental.fs.BuildFSState; import org.jetbrains.jps.incremental.messages.BuildMessage; import org.jetbrains.jps.incremental.messages.CompilerMessage; import org.jetbrains.jps.model.JpsModel; +import org.jetbrains.jps.service.SharedThreadPool; import java.io.File; import java.util.*; @@ -200,6 +203,7 @@ public class Standalone { public static void runBuild(JpsModelLoader loader, File dataStorageRoot, MessageHandler messageHandler, List scopes, boolean includeDependenciesToScope) throws Exception { + final LowMemoryWatcherManager memWatcher = new LowMemoryWatcherManager(SharedThreadPool.getInstance()); final BuildRunner buildRunner = new BuildRunner(loader); ProjectDescriptor descriptor = buildRunner.load(messageHandler, dataStorageRoot, new BuildFSState(true)); try { @@ -207,6 +211,7 @@ public class Standalone { } finally { descriptor.release(); + Disposer.dispose(memWatcher); } } diff --git a/platform/util/src/com/intellij/openapi/util/LowMemoryWatcherManager.java b/platform/util/src/com/intellij/openapi/util/LowMemoryWatcherManager.java index d5e82ed4fc74..ddeb6dc5c16c 100644 --- a/platform/util/src/com/intellij/openapi/util/LowMemoryWatcherManager.java +++ b/platform/util/src/com/intellij/openapi/util/LowMemoryWatcherManager.java @@ -31,6 +31,7 @@ import java.lang.management.MemoryNotificationInfo; import java.lang.management.MemoryPoolMXBean; import java.lang.management.MemoryType; import java.util.MissingResourceException; +import java.util.concurrent.Executor; import java.util.concurrent.ExecutorService; import java.util.concurrent.Future; import java.util.concurrent.atomic.AtomicBoolean; @@ -55,7 +56,7 @@ public class LowMemoryWatcherManager implements Disposable { } }; - public LowMemoryWatcherManager(@NotNull ExecutorService executorService) { + public LowMemoryWatcherManager(@NotNull Executor executorService) { myExecutorService = SequentialTaskExecutor.createSequentialApplicationPoolExecutor("LowMemoryWatcherManager", executorService); try { for (MemoryPoolMXBean bean : ManagementFactory.getMemoryPoolMXBeans()) {