diff options
author | 2017-01-24 09:40:56 -0800 | |
---|---|---|
committer | 2017-01-24 11:47:43 -0800 | |
commit | 72a328949cb6a882762ef140ae306f1fafd24c7e (patch) | |
tree | acf6080e394a8c3a660e1fc92d19feefb66e48a1 | |
parent | 461bbbf6f2e8dddb33a124c598e806b75929c9bb (diff) |
Temporarily increase heap min and max free
Make sure that GC doesn't run too often for TLAB ergonomics. Added a
regression test.
Bug: 34576638
Test: test-art-host
Change-Id: Ie07c7c470aaca044fea20b21cbe6bfe8667d082f
-rw-r--r-- | runtime/gc/heap.cc | 7 | ||||
-rw-r--r-- | test/154-gc-loop/expected.txt | 2 | ||||
-rw-r--r-- | test/154-gc-loop/heap_interface.cc | 28 | ||||
-rw-r--r-- | test/154-gc-loop/info.txt | 1 | ||||
-rw-r--r-- | test/154-gc-loop/src/Main.java | 45 | ||||
-rw-r--r-- | test/Android.bp | 1 |
6 files changed, 82 insertions, 2 deletions
diff --git a/runtime/gc/heap.cc b/runtime/gc/heap.cc index 268cca0cfd..70449797c1 100644 --- a/runtime/gc/heap.cc +++ b/runtime/gc/heap.cc @@ -3543,8 +3543,11 @@ void Heap::GrowForUtilization(collector::GarbageCollector* collector_ran, collector::GcType gc_type = collector_ran->GetGcType(); const double multiplier = HeapGrowthMultiplier(); // Use the multiplier to grow more for // foreground. - const uint64_t adjusted_min_free = static_cast<uint64_t>(min_free_ * multiplier); - const uint64_t adjusted_max_free = static_cast<uint64_t>(max_free_ * multiplier); + // Ensure at least 2.5 MB to temporarily fix excessive GC caused by TLAB ergonomics. + const uint64_t adjusted_min_free = std::max(static_cast<uint64_t>(min_free_ * multiplier), + static_cast<uint64_t>(5 * MB / 2)); + const uint64_t adjusted_max_free = std::max(static_cast<uint64_t>(max_free_ * multiplier), + static_cast<uint64_t>(5 * MB / 2)); if (gc_type != collector::kGcTypeSticky) { // Grow the heap for non sticky GC. ssize_t delta = bytes_allocated / GetTargetHeapUtilization() - bytes_allocated; diff --git a/test/154-gc-loop/expected.txt b/test/154-gc-loop/expected.txt new file mode 100644 index 0000000000..6106818c79 --- /dev/null +++ b/test/154-gc-loop/expected.txt @@ -0,0 +1,2 @@ +JNI_OnLoad called +Finalize count too large: false diff --git a/test/154-gc-loop/heap_interface.cc b/test/154-gc-loop/heap_interface.cc new file mode 100644 index 0000000000..8d610a87fa --- /dev/null +++ b/test/154-gc-loop/heap_interface.cc @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "gc/heap.h" +#include "runtime.h" + +namespace art { +namespace { + +extern "C" JNIEXPORT void JNICALL Java_Main_backgroundProcessState(JNIEnv*, jclass) { + Runtime::Current()->UpdateProcessState(kProcessStateJankImperceptible); +} + +} // namespace +} // namespace art diff --git a/test/154-gc-loop/info.txt b/test/154-gc-loop/info.txt new file mode 100644 index 0000000000..f599db1d01 --- /dev/null +++ b/test/154-gc-loop/info.txt @@ -0,0 +1 @@ +Test that GC doesn't happen too often for a few small allocations. diff --git a/test/154-gc-loop/src/Main.java b/test/154-gc-loop/src/Main.java new file mode 100644 index 0000000000..3a256c109e --- /dev/null +++ b/test/154-gc-loop/src/Main.java @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import java.lang.ref.WeakReference; + +public class Main { + static final class GcWatcher { + protected void finalize() throws Throwable { + watcher = new WeakReference<GcWatcher>(new GcWatcher()); + ++finalizeCounter; + } + } + static WeakReference<GcWatcher> watcher = new WeakReference<GcWatcher>(new GcWatcher()); + static Object o = new Object(); + static int finalizeCounter = 0; + + public static void main(String[] args) { + System.loadLibrary(args[0]); + backgroundProcessState(); + try { + Runtime.getRuntime().gc(); + for (int i = 0; i < 10; ++i) { + o = new Object(); + Thread.sleep(1000); + } + } catch (Exception e) {} + System.out.println("Finalize count too large: " + + ((finalizeCounter >= 10) ? Integer.toString(finalizeCounter) : "false")); + } + + private static native void backgroundProcessState(); +} diff --git a/test/Android.bp b/test/Android.bp index 89e409223e..7143b9177e 100644 --- a/test/Android.bp +++ b/test/Android.bp @@ -317,6 +317,7 @@ cc_defaults { "141-class-unload/jni_unload.cc", "148-multithread-gc-annotations/gc_coverage.cc", "149-suspend-all-stress/suspend_all.cc", + "154-gc-loop/heap_interface.cc", "454-get-vreg/get_vreg_jni.cc", "457-regs/regs_jni.cc", "461-get-reference-vreg/get_reference_vreg_jni.cc", |