optimization of gc load, reduce gc in some scenarios

1.NativeAlloc GC,Increase the count of the number of small native
memory allocations.

2.CollectTransition GC,App's allocations (since last GC) more than the threshold then do GC
when the app was in background. If not then don't do GC.

Expert in charge of ART, please evaluate this CL
and hope to merge it in master branch.

Bug:200116730
Change-Id: Id2977f05eb249691326955e6f2424d4e5e08b417
diff --git a/runtime/gc/heap.cc b/runtime/gc/heap.cc
index c620dbc..70ee449 100644
--- a/runtime/gc/heap.cc
+++ b/runtime/gc/heap.cc
@@ -343,6 +343,7 @@
       old_native_bytes_allocated_(0),
       native_objects_notified_(0),
       num_bytes_freed_revoke_(0),
+      num_bytes_alive_after_gc_(0),
       verify_missing_card_marks_(false),
       verify_system_weaks_(false),
       verify_pre_gc_heap_(verify_pre_gc_heap),
@@ -2741,6 +2742,7 @@
   // Grow the heap so that we know when to perform the next GC.
   GrowForUtilization(collector, bytes_allocated_before_gc);
   old_native_bytes_allocated_.store(GetNativeBytes());
+  num_bytes_alive_after_gc_ = bytes_allocated_before_gc - current_gc_iteration_.GetFreedBytes();
   LogGC(gc_cause, collector);
   FinishGC(self, gc_type);
   // Actually enqueue all cleared references. Do this after the GC has officially finished since
@@ -3873,6 +3875,16 @@
     // For CC, we invoke a full compaction when going to the background, but the collector type
     // doesn't change.
     DCHECK_EQ(desired_collector_type_, kCollectorTypeCCBackground);
+    // App's allocations (since last GC) more than the threshold then do TransitionGC
+    // when the app was in background. If not then don't do TransitionGC.
+    size_t num_bytes_allocated_since_gc = GetBytesAllocated() - num_bytes_alive_after_gc_;
+    if (num_bytes_allocated_since_gc <
+        (UnsignedDifference(target_footprint_.load(std::memory_order_relaxed),
+                            num_bytes_alive_after_gc_)/4)
+        && !kStressCollectorTransition
+        && !IsLowMemoryMode()) {
+      return;
+    }
   }
   DCHECK_NE(collector_type_, kCollectorTypeCCBackground);
   CollectorTransitionTask* added_task = nullptr;
diff --git a/runtime/gc/heap.h b/runtime/gc/heap.h
index 2c25d1d..1a95ea1 100644
--- a/runtime/gc/heap.h
+++ b/runtime/gc/heap.h
@@ -168,7 +168,7 @@
   // as object allocation time. time_to_call_mallinfo seems to be on the order of 1 usec
   // on Android.
 #ifdef __ANDROID__
-  static constexpr uint32_t kNotifyNativeInterval = 32;
+  static constexpr uint32_t kNotifyNativeInterval = 64;
 #else
   // Some host mallinfo() implementations are slow. And memory is less scarce.
   static constexpr uint32_t kNotifyNativeInterval = 384;
@@ -1475,6 +1475,10 @@
   // GC.
   Atomic<size_t> num_bytes_freed_revoke_;
 
+  // Records the number of bytes allocated at the time of GC, which is used later to calculate
+  // how many bytes have been allocated since the last GC
+  size_t num_bytes_alive_after_gc_;
+
   // Info related to the current or previous GC iteration.
   collector::Iteration current_gc_iteration_;