garbage_collector.h revision c93c530efc175954160c3834c93961a1a946a35a
12b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier/* 22b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier * Copyright (C) 2012 The Android Open Source Project 32b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier * 42b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier * Licensed under the Apache License, Version 2.0 (the "License"); 52b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier * you may not use this file except in compliance with the License. 62b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier * You may obtain a copy of the License at 72b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier * 82b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier * http://www.apache.org/licenses/LICENSE-2.0 92b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier * 102b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier * Unless required by applicable law or agreed to in writing, software 112b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier * distributed under the License is distributed on an "AS IS" BASIS, 122b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier * See the License for the specific language governing permissions and 142b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier * limitations under the License. 152b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier */ 162b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier 17fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#ifndef ART_RUNTIME_GC_COLLECTOR_GARBAGE_COLLECTOR_H_ 18fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#define ART_RUNTIME_GC_COLLECTOR_GARBAGE_COLLECTOR_H_ 192b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier 20b2f9936cab87a187f078187c22d9b29d4a188a62Mathieu Chartier#include "base/histogram.h" 21719d1a33f6569864f529e5a3fff59e7bca97aad0Ian Rogers#include "base/mutex.h" 22b2f9936cab87a187f078187c22d9b29d4a188a62Mathieu Chartier#include "base/timing_logger.h" 233e41780cb3bcade3b724908e00443a9caf6977efHiroshi Yamauchi#include "gc/collector_type.h" 246f4ffe41649f1e6381e8cda087ad3749206806e5Hiroshi Yamauchi#include "gc/gc_cause.h" 251d54e73444e017d3a65234e0f193846f3e27472bIan Rogers#include "gc_type.h" 262dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include <stdint.h> 272dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include <vector> 282b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier 292b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartiernamespace art { 301d54e73444e017d3a65234e0f193846f3e27472bIan Rogersnamespace gc { 312b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier 322b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartierclass Heap; 332b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier 341d54e73444e017d3a65234e0f193846f3e27472bIan Rogersnamespace collector { 351d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 362b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartierclass GarbageCollector { 372b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier public: 381d54e73444e017d3a65234e0f193846f3e27472bIan Rogers GarbageCollector(Heap* heap, const std::string& name); 391d54e73444e017d3a65234e0f193846f3e27472bIan Rogers virtual ~GarbageCollector() { } 401d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 411d54e73444e017d3a65234e0f193846f3e27472bIan Rogers const char* GetName() const { 421d54e73444e017d3a65234e0f193846f3e27472bIan Rogers return name_.c_str(); 431d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 442b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier 451d54e73444e017d3a65234e0f193846f3e27472bIan Rogers virtual GcType GetGcType() const = 0; 462b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier 473e41780cb3bcade3b724908e00443a9caf6977efHiroshi Yamauchi virtual CollectorType GetCollectorType() const = 0; 483e41780cb3bcade3b724908e00443a9caf6977efHiroshi Yamauchi 492b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier // Run the garbage collector. 506f4ffe41649f1e6381e8cda087ad3749206806e5Hiroshi Yamauchi void Run(GcCause gc_cause, bool clear_soft_references); 512b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier 521d54e73444e017d3a65234e0f193846f3e27472bIan Rogers Heap* GetHeap() const { 532b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier return heap_; 542b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier } 552b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier 562b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier // Returns how long the mutators were paused in nanoseconds. 572b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier const std::vector<uint64_t>& GetPauseTimes() const { 582b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier return pause_times_; 592b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier } 602b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier 612b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier // Returns how long the GC took to complete in nanoseconds. 621d54e73444e017d3a65234e0f193846f3e27472bIan Rogers uint64_t GetDurationNs() const { 631d54e73444e017d3a65234e0f193846f3e27472bIan Rogers return duration_ns_; 642b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier } 652b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier 661d54e73444e017d3a65234e0f193846f3e27472bIan Rogers void RegisterPause(uint64_t nano_length); 671d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 685fe9af720048673e62ee29597a30bb9e54c903c5Ian Rogers TimingLogger& GetTimings() { 691d54e73444e017d3a65234e0f193846f3e27472bIan Rogers return timings_; 701d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 712b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier 721d54e73444e017d3a65234e0f193846f3e27472bIan Rogers CumulativeLogger& GetCumulativeTimings() { 731d54e73444e017d3a65234e0f193846f3e27472bIan Rogers return cumulative_timings_; 741d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 752b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier 761d54e73444e017d3a65234e0f193846f3e27472bIan Rogers void ResetCumulativeStatistics(); 771d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 781d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Swap the live and mark bitmaps of spaces that are active for the collector. For partial GC, 791d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // this is the allocation space, for full GC then we swap the zygote bitmaps too. 801d54e73444e017d3a65234e0f193846f3e27472bIan Rogers void SwapBitmaps() EXCLUSIVE_LOCKS_REQUIRED(Locks::heap_bitmap_lock_); 812b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier 82590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier size_t GetFreedBytes() const { 83590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier return freed_bytes_; 84590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier } 85590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier 86590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier size_t GetFreedLargeObjectBytes() const { 87590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier return freed_large_object_bytes_; 88590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier } 89590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier 90590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier size_t GetFreedObjects() const { 91590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier return freed_objects_; 92590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier } 93590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier 94590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier size_t GetFreedLargeObjects() const { 95590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier return freed_large_objects_; 96590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier } 97590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier 98590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier uint64_t GetTotalPausedTimeNs() const { 99b2f9936cab87a187f078187c22d9b29d4a188a62Mathieu Chartier return pause_histogram_.Sum(); 100590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier } 101590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier 102590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier uint64_t GetTotalFreedBytes() const { 103590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier return total_freed_bytes_; 104590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier } 105590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier 106590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier uint64_t GetTotalFreedObjects() const { 107590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier return total_freed_objects_; 108590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier } 109590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier 110b2f9936cab87a187f078187c22d9b29d4a188a62Mathieu Chartier const Histogram<uint64_t>& GetPauseHistogram() const { 111b2f9936cab87a187f078187c22d9b29d4a188a62Mathieu Chartier return pause_histogram_; 112b2f9936cab87a187f078187c22d9b29d4a188a62Mathieu Chartier } 113b2f9936cab87a187f078187c22d9b29d4a188a62Mathieu Chartier 1142b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier protected: 1152dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // The initial phase. Done without mutators paused. 1162b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier virtual void InitializePhase() = 0; 1172b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier 1182b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier // Mark all reachable objects, done concurrently. 1192b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier virtual void MarkingPhase() = 0; 1202b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier 1213e41780cb3bcade3b724908e00443a9caf6977efHiroshi Yamauchi // Only called for concurrent GCs. 1223e41780cb3bcade3b724908e00443a9caf6977efHiroshi Yamauchi virtual void HandleDirtyObjectsPhase() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 1232b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier 1242b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier // Called with mutators running. 1252b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier virtual void ReclaimPhase() = 0; 1262b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier 1272dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Called after the GC is finished. Done without mutators paused. 1282b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier virtual void FinishPhase() = 0; 1292b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier 130c93c530efc175954160c3834c93961a1a946a35aHiroshi Yamauchi // Revoke all the thread-local buffers. 131c93c530efc175954160c3834c93961a1a946a35aHiroshi Yamauchi virtual void RevokeAllThreadLocalBuffers() = 0; 132d6534315596326f1a65aa2d300144c09205c5122Mathieu Chartier 133b2f9936cab87a187f078187c22d9b29d4a188a62Mathieu Chartier static constexpr size_t kPauseBucketSize = 500; 134b2f9936cab87a187f078187c22d9b29d4a188a62Mathieu Chartier static constexpr size_t kPauseBucketCount = 32; 135b2f9936cab87a187f078187c22d9b29d4a188a62Mathieu Chartier 1361d54e73444e017d3a65234e0f193846f3e27472bIan Rogers Heap* const heap_; 1371d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 1381d54e73444e017d3a65234e0f193846f3e27472bIan Rogers std::string name_; 1391d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 1406f4ffe41649f1e6381e8cda087ad3749206806e5Hiroshi Yamauchi GcCause gc_cause_; 141590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier bool clear_soft_references_; 142590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier 1431d54e73444e017d3a65234e0f193846f3e27472bIan Rogers const bool verbose_; 1441d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 1451d54e73444e017d3a65234e0f193846f3e27472bIan Rogers uint64_t duration_ns_; 1465fe9af720048673e62ee29597a30bb9e54c903c5Ian Rogers TimingLogger timings_; 1471d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 1481d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Cumulative statistics. 149b2f9936cab87a187f078187c22d9b29d4a188a62Mathieu Chartier Histogram<uint64_t> pause_histogram_; 1501d54e73444e017d3a65234e0f193846f3e27472bIan Rogers uint64_t total_time_ns_; 1511d54e73444e017d3a65234e0f193846f3e27472bIan Rogers uint64_t total_freed_objects_; 1521d54e73444e017d3a65234e0f193846f3e27472bIan Rogers uint64_t total_freed_bytes_; 1531d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 154590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier // Single GC statitstics. 155590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier AtomicInteger freed_bytes_; 156590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier AtomicInteger freed_large_object_bytes_; 157590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier AtomicInteger freed_objects_; 158590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier AtomicInteger freed_large_objects_; 159590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier 1601d54e73444e017d3a65234e0f193846f3e27472bIan Rogers CumulativeLogger cumulative_timings_; 1611d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 1622b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier std::vector<uint64_t> pause_times_; 1632b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier}; 1642b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier 1651d54e73444e017d3a65234e0f193846f3e27472bIan Rogers} // namespace collector 1661d54e73444e017d3a65234e0f193846f3e27472bIan Rogers} // namespace gc 1672b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier} // namespace art 1682b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier 169fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#endif // ART_RUNTIME_GC_COLLECTOR_GARBAGE_COLLECTOR_H_ 170