garbage_collector.h revision fc0e3219edc9a5bf81b166e82fd5db2796eb6a0d
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 201d54e73444e017d3a65234e0f193846f3e27472bIan Rogers#include "gc_type.h" 212b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier#include "locks.h" 221d54e73444e017d3a65234e0f193846f3e27472bIan Rogers#include "base/timing_logger.h" 232dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 242dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include <stdint.h> 252dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include <vector> 262b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier 272b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartiernamespace art { 281d54e73444e017d3a65234e0f193846f3e27472bIan Rogersnamespace gc { 292b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier 302b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartierclass Heap; 312b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier 321d54e73444e017d3a65234e0f193846f3e27472bIan Rogersnamespace collector { 331d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 342b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartierclass GarbageCollector { 352b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier public: 362b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier // Returns true iff the garbage collector is concurrent. 372b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier virtual bool IsConcurrent() const = 0; 382b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier 391d54e73444e017d3a65234e0f193846f3e27472bIan Rogers GarbageCollector(Heap* heap, const std::string& name); 401d54e73444e017d3a65234e0f193846f3e27472bIan Rogers virtual ~GarbageCollector() { } 411d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 421d54e73444e017d3a65234e0f193846f3e27472bIan Rogers const char* GetName() const { 431d54e73444e017d3a65234e0f193846f3e27472bIan Rogers return name_.c_str(); 441d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 452b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier 461d54e73444e017d3a65234e0f193846f3e27472bIan Rogers virtual GcType GetGcType() const = 0; 472b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier 482b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier // Run the garbage collector. 492b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier void Run(); 502b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier 511d54e73444e017d3a65234e0f193846f3e27472bIan Rogers Heap* GetHeap() const { 522b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier return heap_; 532b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier } 542b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier 552b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier // Returns how long the mutators were paused in nanoseconds. 562b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier const std::vector<uint64_t>& GetPauseTimes() const { 572b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier return pause_times_; 582b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier } 592b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier 602b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier // Returns how long the GC took to complete in nanoseconds. 611d54e73444e017d3a65234e0f193846f3e27472bIan Rogers uint64_t GetDurationNs() const { 621d54e73444e017d3a65234e0f193846f3e27472bIan Rogers return duration_ns_; 632b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier } 642b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier 651d54e73444e017d3a65234e0f193846f3e27472bIan Rogers void RegisterPause(uint64_t nano_length); 661d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 671d54e73444e017d3a65234e0f193846f3e27472bIan Rogers base::NewTimingLogger& GetTimings() { 681d54e73444e017d3a65234e0f193846f3e27472bIan Rogers return timings_; 691d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 702b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier 711d54e73444e017d3a65234e0f193846f3e27472bIan Rogers CumulativeLogger& GetCumulativeTimings() { 721d54e73444e017d3a65234e0f193846f3e27472bIan Rogers return cumulative_timings_; 731d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 742b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier 751d54e73444e017d3a65234e0f193846f3e27472bIan Rogers void ResetCumulativeStatistics(); 761d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 771d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Swap the live and mark bitmaps of spaces that are active for the collector. For partial GC, 781d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // this is the allocation space, for full GC then we swap the zygote bitmaps too. 791d54e73444e017d3a65234e0f193846f3e27472bIan Rogers void SwapBitmaps() EXCLUSIVE_LOCKS_REQUIRED(Locks::heap_bitmap_lock_); 802b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier 812b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier protected: 821d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 832dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // The initial phase. Done without mutators paused. 842b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier virtual void InitializePhase() = 0; 852b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier 862b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier // Mark all reachable objects, done concurrently. 872b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier virtual void MarkingPhase() = 0; 882b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier 892b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier // Only called for concurrent GCs. Gets called repeatedly until it succeeds. 902b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier virtual bool HandleDirtyObjectsPhase() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 912b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier 922b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier // Called with mutators running. 932b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier virtual void ReclaimPhase() = 0; 942b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier 952dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Called after the GC is finished. Done without mutators paused. 962b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier virtual void FinishPhase() = 0; 972b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier 981d54e73444e017d3a65234e0f193846f3e27472bIan Rogers Heap* const heap_; 991d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 1001d54e73444e017d3a65234e0f193846f3e27472bIan Rogers std::string name_; 1011d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 1021d54e73444e017d3a65234e0f193846f3e27472bIan Rogers const bool verbose_; 1031d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 1041d54e73444e017d3a65234e0f193846f3e27472bIan Rogers uint64_t duration_ns_; 1051d54e73444e017d3a65234e0f193846f3e27472bIan Rogers base::NewTimingLogger timings_; 1061d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 1071d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Cumulative statistics. 1081d54e73444e017d3a65234e0f193846f3e27472bIan Rogers uint64_t total_time_ns_; 1091d54e73444e017d3a65234e0f193846f3e27472bIan Rogers uint64_t total_paused_time_ns_; 1101d54e73444e017d3a65234e0f193846f3e27472bIan Rogers uint64_t total_freed_objects_; 1111d54e73444e017d3a65234e0f193846f3e27472bIan Rogers uint64_t total_freed_bytes_; 1121d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 1131d54e73444e017d3a65234e0f193846f3e27472bIan Rogers CumulativeLogger cumulative_timings_; 1141d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 1152b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier std::vector<uint64_t> pause_times_; 1162b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier}; 1172b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier 1181d54e73444e017d3a65234e0f193846f3e27472bIan Rogers} // namespace collector 1191d54e73444e017d3a65234e0f193846f3e27472bIan Rogers} // namespace gc 1202b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier} // namespace art 1212b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier 122fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#endif // ART_RUNTIME_GC_COLLECTOR_GARBAGE_COLLECTOR_H_ 123