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