diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 7d5b8f62289d4..6bb3ff9471ce6 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -991,7 +991,7 @@ public final class ActivityThread { long nativeFree = Debug.getNativeHeapFreeSize() / 1024; Runtime runtime = Runtime.getRuntime(); - + runtime.gc(); // Do GC since countInstancesOfClass counts unreachable objects. long dalvikMax = runtime.totalMemory() / 1024; long dalvikFree = runtime.freeMemory() / 1024; long dalvikAllocated = dalvikMax - dalvikFree; diff --git a/core/java/android/os/StrictMode.java b/core/java/android/os/StrictMode.java index f10b982af750b..87ce12cbe37ce 100644 --- a/core/java/android/os/StrictMode.java +++ b/core/java/android/os/StrictMode.java @@ -1574,7 +1574,8 @@ public final class StrictMode { */ public static void conditionallyCheckInstanceCounts() { VmPolicy policy = getVmPolicy(); - if (policy.classInstanceLimit.size() == 0) { + int policySize = policy.classInstanceLimit.size(); + if (policySize == 0) { return; } @@ -1583,15 +1584,17 @@ public final class StrictMode { System.gc(); // Note: classInstanceLimit is immutable, so this is lock-free - for (Map.Entry entry : policy.classInstanceLimit.entrySet()) { - Class klass = entry.getKey(); - int limit = entry.getValue(); - long instances = VMDebug.countInstancesOfClass(klass, false); - if (instances <= limit) { - continue; + // Create the classes array. + Class[] classes = policy.classInstanceLimit.keySet().toArray(new Class[policySize]); + long[] instanceCounts = VMDebug.countInstancesOfClasses(classes, false); + for (int i = 0; i < classes.length; ++i) { + Class klass = classes[i]; + int limit = policy.classInstanceLimit.get(klass); + long instances = instanceCounts[i]; + if (instances > limit) { + Throwable tr = new InstanceCountViolation(klass, instances, limit); + onVmPolicyViolation(tr.getMessage(), tr); } - Throwable tr = new InstanceCountViolation(klass, instances, limit); - onVmPolicyViolation(tr.getMessage(), tr); } }