| // Copyright 2019 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| package org.chromium.base; |
| |
| import java.lang.ref.WeakReference; |
| |
| /** Utils for doing garbage collection tests. */ |
| public class GarbageCollectionTestUtils { |
| /** |
| * Relying on just one single GC might make instrumentation tests flaky. |
| * Note that {@link #MAX_GC_ITERATIONS} * {@link #GC_SLEEP_TIME} should not be too large, |
| * since there are tests asserting objects NOT garbage collected. |
| */ |
| private static final int MAX_GC_ITERATIONS = 3; |
| |
| private static final long GC_SLEEP_TIME = 10; |
| |
| /** |
| * Do garbage collection and see if an object is released. |
| * @param reference A {@link WeakReference} pointing to the object. |
| * @return Whether the object can be garbage-collected. |
| */ |
| public static boolean canBeGarbageCollected(WeakReference<?> reference) { |
| // Robolectric tests, one iteration is enough. |
| final int iterations = MAX_GC_ITERATIONS; |
| final long sleepTime = GC_SLEEP_TIME; |
| Runtime runtime = Runtime.getRuntime(); |
| for (int i = 0; i < iterations; i++) { |
| runtime.runFinalization(); |
| runtime.gc(); |
| if (reference.get() == null) return true; |
| |
| // Pause for a while and then go back around the loop to try again. |
| try { |
| Thread.sleep(sleepTime); |
| } catch (InterruptedException e) { |
| // Ignore any interrupts and just try again. |
| } |
| } |
| |
| return reference.get() == null; |
| } |
| } |