1 /* 2 * Copyright (c) 2021 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef ECMASCRIPT_MEM_GC_STATS_H 17 #define ECMASCRIPT_MEM_GC_STATS_H 18 19 #include <chrono> 20 #include <cstring> 21 #include <time.h> 22 23 #include "libpandabase/macros.h" 24 #include "ecmascript/mem/mem_common.h" 25 26 namespace panda::ecmascript { 27 class Heap; 28 class GCStats { 29 using Duration = std::chrono::duration<uint64_t, std::nano>; 30 31 public: GCStats(const Heap * heap)32 explicit GCStats(const Heap *heap) : heap_(heap) {} GCStats(const Heap * heap,size_t longPuaseTime)33 explicit GCStats(const Heap *heap, size_t longPuaseTime) : heap_(heap), 34 longPauseTime_(longPuaseTime) {} 35 ~GCStats() = default; 36 37 void PrintStatisticResult(bool force = false); 38 void PrintHeapStatisticResult(bool force = true); 39 40 void StatisticSTWYoungGC(Duration time, size_t aliveSize, size_t promotedSize, size_t commitSize); 41 void StatisticPartialGC(bool concurrentMark, Duration time, size_t freeSize); 42 void StatisticFullGC(Duration time, size_t youngAndOldAliveSize, size_t youngCommitSize, 43 size_t oldCommitSize, size_t nonMoveSpaceFreeSize, size_t nonMoveSpaceCommitSize); 44 void StatisticConcurrentMark(Duration time); 45 void StatisticConcurrentMarkWait(Duration time); 46 void StatisticConcurrentRemark(Duration time); 47 void StatisticConcurrentEvacuate(Duration time); 48 49 void CheckIfLongTimePause(); 50 private: 51 void PrintSemiStatisticResult(bool force); 52 void PrintPartialStatisticResult(bool force); 53 void PrintCompressStatisticResult(bool force); 54 TimeToMicroseconds(Duration time)55 size_t TimeToMicroseconds(Duration time) 56 { 57 return std::chrono::duration_cast<std::chrono::microseconds>(time).count(); 58 } 59 PrintTimeMilliseconds(uint64_t ms)60 float PrintTimeMilliseconds(uint64_t ms) 61 { 62 return (float)ms / THOUSAND; 63 } 64 sizeToMB(size_t size)65 float sizeToMB(size_t size) 66 { 67 return (float)size / 1_MB; 68 } 69 70 size_t lastSemiGCCount_ = 0; 71 size_t semiGCCount_ = 0; 72 size_t semiGCMinPause_ = 0; 73 size_t semiGCMaxPause_ = 0; 74 size_t semiGCTotalPause_ = 0; 75 size_t semiTotalAliveSize_ = 0; 76 size_t semiTotalCommitSize_ = 0; 77 size_t semiTotalPromoteSize_ = 0; 78 79 size_t lastOldGCCount_ = 0; 80 size_t partialGCCount_ = 0; 81 size_t partialGCMinPause_ = 0; 82 size_t partialGCMaxPause_ = 0; 83 size_t partialGCTotalPause_ = 0; 84 size_t partialOldSpaceFreeSize_ = 0; 85 86 size_t lastOldConcurrentMarkGCCount_ = 0; 87 size_t partialConcurrentMarkGCPauseTime_ = 0; 88 size_t partialConcurrentMarkMarkPause_ = 0; 89 size_t partialConcurrentMarkWaitPause_ = 0; 90 size_t partialConcurrentMarkRemarkPause_ = 0; 91 size_t partialConcurrentMarkEvacuatePause_ = 0; 92 size_t partialConcurrentMarkGCCount_ = 0; 93 size_t partialConcurrentMarkGCMinPause_ = 0; 94 size_t partialConcurrentMarkGCMaxPause_ = 0; 95 size_t partialConcurrentMarkGCTotalPause_ = 0; 96 size_t partialOldSpaceConcurrentMarkFreeSize_ = 0; 97 98 size_t lastFullGCCount_ = 0; 99 size_t fullGCCount_ = 0; 100 size_t fullGCMinPause_ = 0; 101 size_t fullGCMaxPause_ = 0; 102 size_t fullGCTotalPause_ = 0; 103 size_t compressYoungAndOldAliveSize_ = 0; 104 size_t compressYoungCommitSize_ = 0; 105 size_t compressOldCommitSize_ = 0; 106 size_t compressNonMoveTotalFreeSize_ = 0; 107 size_t compressNonMoveTotalCommitSize_ = 0; 108 109 const Heap *heap_; 110 std::string currentGcType_ = ""; 111 size_t currentPauseTime_ = 0; 112 size_t longPauseTime_ = 0; 113 114 static constexpr uint32_t THOUSAND = 1000; 115 116 NO_COPY_SEMANTIC(GCStats); 117 NO_MOVE_SEMANTIC(GCStats); 118 }; 119 } // namespace panda::ecmascript 120 121 #endif // ECMASCRIPT_MEM_GC_STATS_H 122