From afb80064cf8edf095f5ced17b8e2617e7de06ff1 Mon Sep 17 00:00:00 2001 From: LoveSy Date: Sun, 30 Jan 2022 12:35:42 +0800 Subject: [PATCH] JVM's GC sucks (#1584) --- .../java/org/lsposed/lspd/service/ConfigManager.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/daemon/src/main/java/org/lsposed/lspd/service/ConfigManager.java b/daemon/src/main/java/org/lsposed/lspd/service/ConfigManager.java index f60d4dcc..6f90c94e 100644 --- a/daemon/src/main/java/org/lsposed/lspd/service/ConfigManager.java +++ b/daemon/src/main/java/org/lsposed/lspd/service/ConfigManager.java @@ -36,6 +36,7 @@ import android.os.HandlerThread; import android.os.ParcelFileDescriptor; import android.os.RemoteException; import android.os.SELinux; +import android.os.SharedMemory; import android.os.SystemClock; import android.system.ErrnoException; import android.system.Os; @@ -436,6 +437,7 @@ public class ConfigManager { if (lastModuleCacheTime >= requestModuleCacheTime) return; else lastModuleCacheTime = SystemClock.elapsedRealtime(); } + Set toClose = ConcurrentHashMap.newKeySet(); try (Cursor cursor = db.query(true, "modules", new String[]{"module_pkg_name", "apk_path"}, "enabled = 1", null, null, null, null, null)) { if (cursor == null) { @@ -447,7 +449,13 @@ public class ConfigManager { Set obsoleteModules = new HashSet<>(); // packageName, apkPath Map obsoletePaths = new HashMap<>(); - cachedModule.values().removeIf(m -> m.apkPath == null || !existsInGlobalNamespace(m.apkPath)); + cachedModule.values().removeIf(m -> { + if (m.apkPath == null || !existsInGlobalNamespace(m.apkPath)) { + toClose.addAll(m.file.preLoadedDexes); + return true; + } + return false; + }); while (cursor.moveToNext()) { String packageName = cursor.getString(pkgNameIdx); String apkPath = cursor.getString(apkPathIdx); @@ -508,6 +516,7 @@ public class ConfigManager { Log.d(TAG, module.getKey() + " " + module.getValue().apkPath); } cacheScopes(); + toClose.forEach(SharedMemory::close); } private synchronized void cacheScopes() {