Maintain global list of caches; purge on low memory
Bug: 140788621
Test: m
Merged-In: I3ba88e0a6f6c0f26465903988e7432156bd5be20
Change-Id: I3ba88e0a6f6c0f26465903988e7432156bd5be20
(cherry picked from commit 22c2ddb201)
This commit is contained in:
committed by
Collin Fijalkovich
parent
1daf6ea6a3
commit
8c239da8d5
@@ -6202,6 +6202,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();
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user