diff a/src/hotspot/share/gc/shenandoah/shenandoahCardStats.hpp b/src/hotspot/share/gc/shenandoah/shenandoahCardStats.hpp
--- /dev/null
+++ b/src/hotspot/share/gc/shenandoah/shenandoahCardStats.hpp
@@ -0,0 +1,132 @@
+/*
+ * Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ *
+ */
+
+#ifndef SHARE_GC_SHENANDOAH_SHENANDOAHCARDSTATS_HPP
+#define SHARE_GC_SHENANDOAH_SHENANDOAHCARDSTATS_HPP
+
+#include "gc/shared/gc_globals.hpp"
+#include "gc/shenandoah/shenandoahNumberSeq.hpp"
+
+enum CardStatType {
+  DIRTY_RUN,
+  CLEAN_RUN,
+  DIRTY_CARDS,
+  CLEAN_CARDS,
+  MAX_DIRTY_RUN,
+  MAX_CLEAN_RUN,
+  DIRTY_SCAN_OBJS,
+  ALTERNATIONS,
+  MAX_CARD_STAT_TYPE
+};
+
+enum CardStatLogType {
+  CARD_STAT_SCAN_RS,
+  CARD_STAT_UPDATE_REFS,
+  MAX_CARD_STAT_LOG_TYPE
+};
+
+class ShenandoahCardStats: public CHeapObj<mtGC> {
+private:
+  size_t _cards_in_cluster;
+  HdrSeq* _local_card_stats;
+
+  size_t _dirty_card_cnt;
+  size_t _clean_card_cnt;
+
+  size_t _max_dirty_run;
+  size_t _max_clean_run;
+
+  size_t _dirty_scan_obj_cnt;
+
+  size_t _alternation_cnt;
+
+public:
+  ShenandoahCardStats(size_t cards_in_cluster, HdrSeq* card_stats) :
+    _cards_in_cluster(cards_in_cluster),
+    _local_card_stats(card_stats),
+    _dirty_card_cnt(0),
+    _clean_card_cnt(0),
+    _max_dirty_run(0),
+    _max_clean_run(0),
+    _dirty_scan_obj_cnt(0),
+    _alternation_cnt(0)
+  { }
+
+  ~ShenandoahCardStats() {
+    record();
+   }
+
+   void record() {
+    if (ShenandoahEnableCardStats) {
+      // Update global stats for distribution of dirty/clean cards as a percentage of chunk
+      _local_card_stats[DIRTY_CARDS].add(percent_of(_dirty_card_cnt, _cards_in_cluster));
+      _local_card_stats[CLEAN_CARDS].add(percent_of(_clean_card_cnt, _cards_in_cluster));
+
+      // Update global stats for max dirty/clean run distribution as a percentage of chunk
+      _local_card_stats[MAX_DIRTY_RUN].add(percent_of(_max_dirty_run, _cards_in_cluster));
+      _local_card_stats[MAX_CLEAN_RUN].add(percent_of(_max_clean_run, _cards_in_cluster));
+
+      // Update global stats for dirty obj scan counts
+      _local_card_stats[DIRTY_SCAN_OBJS].add(_dirty_scan_obj_cnt);
+
+      // Update global stats for alternation counts
+      _local_card_stats[ALTERNATIONS].add(_alternation_cnt);
+    }
+  }
+
+public:
+  inline void record_dirty_run(size_t len) {
+    if (ShenandoahEnableCardStats) {
+      _alternation_cnt++;
+      if (len > _max_dirty_run) {
+        _max_dirty_run = len;
+      }
+      _dirty_card_cnt += len;
+      assert(len <= _cards_in_cluster, "Error");
+      _local_card_stats[DIRTY_RUN].add(percent_of(len, _cards_in_cluster));
+    }
+  }
+
+  inline void record_clean_run(size_t len) {
+    if (ShenandoahEnableCardStats) {
+      _alternation_cnt++;
+      if (len > _max_clean_run) {
+        _max_clean_run = len;
+      }
+      _clean_card_cnt += len;
+      assert(len <= _cards_in_cluster, "Error");
+      _local_card_stats[CLEAN_RUN].add(percent_of(len, _cards_in_cluster));
+    }
+  }
+
+  inline void record_scan_obj_cnt(size_t i) {
+    if (ShenandoahEnableCardStats) {
+      _dirty_scan_obj_cnt += i;
+    }
+  }
+
+  void log() const PRODUCT_RETURN;
+};
+
+#endif // SHARE_GC_SHENANDOAH_SHENANDOAHCARDSTATS_HPP
