Maintain global list of caches; purge on low memory am: 8c239da8d5 am: be2c17c588 am: dcca1f0c8b

Change-Id: I53bb074af4b1e5a4cb325e52e096ed533a4d6039
This commit is contained in:
Daniel Colascione
2020-05-18 21:22:00 +00:00
committed by Automerger Merge Worker
2 changed files with 31 additions and 0 deletions

View File

@@ -6224,6 +6224,12 @@ public final class ActivityThread extends ClientTransactionHandler {
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "trimMemory");
if (DEBUG_MEMORY_TRIM) Slog.v(TAG, "Trimming memory to level: " + level);
if (level >= ComponentCallbacks2.TRIM_MEMORY_COMPLETE) {
for (PropertyInvalidatedCache pic : PropertyInvalidatedCache.getActiveCaches()) {
pic.clear();
}
}
ArrayList<ComponentCallbacks2> callbacks = collectComponentCallbacks(true, null);
final int N = callbacks.size();

View File

@@ -27,11 +27,13 @@ import android.util.Log;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Objects;
import java.util.Random;
import java.util.WeakHashMap;
import java.util.concurrent.atomic.AtomicLong;
/**
@@ -197,6 +199,14 @@ public abstract class PropertyInvalidatedCache<Query, Result> {
@GuardedBy("sCorkLock")
private static final HashMap<String, Integer> sCorks = new HashMap<>();
/**
* Weakly references all cache objects in the current process, allowing us to iterate over
* them all for purposes like issuing debug dumps and reacting to memory pressure.
*/
@GuardedBy("sCorkLock")
private static final WeakHashMap<PropertyInvalidatedCache, Void> sCaches =
new WeakHashMap<>();
private final Object mLock = new Object();
/**
@@ -241,6 +251,9 @@ public abstract class PropertyInvalidatedCache<Query, Result> {
return size() > maxEntries;
}
};
synchronized (sCorkLock) {
sCaches.put(this, null);
}
}
/**
@@ -248,6 +261,9 @@ public abstract class PropertyInvalidatedCache<Query, Result> {
*/
public final void clear() {
synchronized (mLock) {
if (DEBUG) {
Log.d(TAG, "clearing cache for " + mPropertyName);
}
mCache.clear();
}
}
@@ -710,4 +726,13 @@ public abstract class PropertyInvalidatedCache<Query, Result> {
Log.d(TAG, "disabling all caches in the process");
sEnabled = false;
}
/**
* Return a list of caches alive at the current time.
*/
public static ArrayList<PropertyInvalidatedCache> getActiveCaches() {
synchronized (sCorkLock) {
return new ArrayList<PropertyInvalidatedCache>(sCaches.keySet());
}
}
}