memReporter.hpp revision 3465:d2a62e0f25eb
1/* 2 * Copyright (c) 2012 Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 * 23 */ 24 25#ifndef SHARE_VM_SERVICES_MEM_REPORTER_HPP 26#define SHARE_VM_SERVICES_MEM_REPORTER_HPP 27 28#include "runtime/mutexLocker.hpp" 29#include "services/memBaseline.hpp" 30#include "services/memTracker.hpp" 31#include "utilities/ostream.hpp" 32 33/* 34 * MemBaselineReporter reports data to this outputer class, 35 * ReportOutputer is responsible for format, store and redirect 36 * the data to the final destination. 37 */ 38class BaselineOutputer : public StackObj { 39 public: 40 // start to report memory usage in specified scale. 41 // if report_diff = true, the reporter reports baseline comparison 42 // information. 43 44 virtual void start(size_t scale, bool report_diff = false) = 0; 45 // Done reporting 46 virtual void done() = 0; 47 48 /* report baseline summary information */ 49 virtual void total_usage(size_t total_reserved, 50 size_t total_committed) = 0; 51 virtual void num_of_classes(size_t classes) = 0; 52 virtual void num_of_threads(size_t threads) = 0; 53 54 virtual void thread_info(size_t stack_reserved_amt, size_t stack_committed_amt) = 0; 55 56 /* report baseline summary comparison */ 57 virtual void diff_total_usage(size_t total_reserved, 58 size_t total_committed, 59 int reserved_diff, 60 int committed_diff) = 0; 61 virtual void diff_num_of_classes(size_t classes, int diff) = 0; 62 virtual void diff_num_of_threads(size_t threads, int diff) = 0; 63 64 virtual void diff_thread_info(size_t stack_reserved, size_t stack_committed, 65 int stack_reserved_diff, int stack_committed_diff) = 0; 66 67 68 /* 69 * memory summary by memory types. 70 * for each memory type, following summaries are reported: 71 * - reserved amount, committed amount 72 * - malloc'd amount, malloc count 73 * - arena amount, arena count 74 */ 75 76 // start reporting memory summary by memory type 77 virtual void start_category_summary() = 0; 78 79 virtual void category_summary(MEMFLAGS type, size_t reserved_amt, 80 size_t committed_amt, 81 size_t malloc_amt, size_t malloc_count, 82 size_t arena_amt, size_t arena_count) = 0; 83 84 virtual void diff_category_summary(MEMFLAGS type, size_t cur_reserved_amt, 85 size_t cur_committed_amt, 86 size_t cur_malloc_amt, size_t cur_malloc_count, 87 size_t cur_arena_amt, size_t cur_arena_count, 88 int reserved_diff, int committed_diff, int malloc_diff, 89 int malloc_count_diff, int arena_diff, 90 int arena_count_diff) = 0; 91 92 virtual void done_category_summary() = 0; 93 94 /* 95 * Report callsite information 96 */ 97 virtual void start_callsite() = 0; 98 virtual void malloc_callsite(address pc, size_t malloc_amt, size_t malloc_count) = 0; 99 virtual void virtual_memory_callsite(address pc, size_t reserved_amt, size_t committed_amt) = 0; 100 101 virtual void diff_malloc_callsite(address pc, size_t cur_malloc_amt, size_t cur_malloc_count, 102 int malloc_diff, int malloc_count_diff) = 0; 103 virtual void diff_virtual_memory_callsite(address pc, size_t cur_reserved_amt, size_t cur_committed_amt, 104 int reserved_diff, int committed_diff) = 0; 105 106 virtual void done_callsite() = 0; 107 108 // return current scale in "KB", "MB" or "GB" 109 static const char* memory_unit(size_t scale); 110}; 111 112/* 113 * This class reports processed data from a baseline or 114 * the changes between the two baseline. 115 */ 116class BaselineReporter : public StackObj { 117 private: 118 BaselineOutputer& _outputer; 119 size_t _scale; 120 121 public: 122 // construct a reporter that reports memory usage 123 // in specified scale 124 BaselineReporter(BaselineOutputer& outputer, size_t scale = K): 125 _outputer(outputer) { 126 _scale = scale; 127 } 128 virtual void report_baseline(const MemBaseline& baseline, bool summary_only = false); 129 virtual void diff_baselines(const MemBaseline& cur, const MemBaseline& prev, 130 bool summary_only = false); 131 132 void set_scale(size_t scale); 133 size_t scale() const { return _scale; } 134 135 private: 136 void report_summaries(const MemBaseline& baseline); 137 void report_callsites(const MemBaseline& baseline); 138 139 void diff_summaries(const MemBaseline& cur, const MemBaseline& prev); 140 void diff_callsites(const MemBaseline& cur, const MemBaseline& prev); 141 142 // calculate memory size in current memory scale 143 size_t amount_in_current_scale(size_t amt) const; 144 // diff two unsigned values in current memory scale 145 int diff_in_current_scale(size_t value1, size_t value2) const; 146 // diff two unsigned value 147 int diff(size_t value1, size_t value2) const; 148}; 149 150/* 151 * tty output implementation. Native memory tracking 152 * DCmd uses this outputer. 153 */ 154class BaselineTTYOutputer : public BaselineOutputer { 155 private: 156 size_t _scale; 157 158 size_t _num_of_classes; 159 size_t _num_of_threads; 160 size_t _thread_stack_reserved; 161 size_t _thread_stack_committed; 162 163 int _num_of_classes_diff; 164 int _num_of_threads_diff; 165 int _thread_stack_reserved_diff; 166 int _thread_stack_committed_diff; 167 168 outputStream* _output; 169 170 public: 171 BaselineTTYOutputer(outputStream* st) { 172 _scale = K; 173 _num_of_classes = 0; 174 _num_of_threads = 0; 175 _thread_stack_reserved = 0; 176 _thread_stack_committed = 0; 177 _num_of_classes_diff = 0; 178 _num_of_threads_diff = 0; 179 _thread_stack_reserved_diff = 0; 180 _thread_stack_committed_diff = 0; 181 _output = st; 182 } 183 184 // begin reporting memory usage in specified scale 185 void start(size_t scale, bool report_diff = false); 186 // done reporting 187 void done(); 188 189 // total memory usage 190 void total_usage(size_t total_reserved, 191 size_t total_committed); 192 // report total loaded classes 193 void num_of_classes(size_t classes) { 194 _num_of_classes = classes; 195 } 196 197 void num_of_threads(size_t threads) { 198 _num_of_threads = threads; 199 } 200 201 void thread_info(size_t stack_reserved_amt, size_t stack_committed_amt) { 202 _thread_stack_reserved = stack_reserved_amt; 203 _thread_stack_committed = stack_committed_amt; 204 } 205 206 void diff_total_usage(size_t total_reserved, 207 size_t total_committed, 208 int reserved_diff, 209 int committed_diff); 210 211 void diff_num_of_classes(size_t classes, int diff) { 212 _num_of_classes = classes; 213 _num_of_classes_diff = diff; 214 } 215 216 void diff_num_of_threads(size_t threads, int diff) { 217 _num_of_threads = threads; 218 _num_of_threads_diff = diff; 219 } 220 221 void diff_thread_info(size_t stack_reserved_amt, size_t stack_committed_amt, 222 int stack_reserved_diff, int stack_committed_diff) { 223 _thread_stack_reserved = stack_reserved_amt; 224 _thread_stack_committed = stack_committed_amt; 225 _thread_stack_reserved_diff = stack_reserved_diff; 226 _thread_stack_committed_diff = stack_committed_diff; 227 } 228 229 /* 230 * Report memory summary categoriuzed by memory types. 231 * For each memory type, following summaries are reported: 232 * - reserved amount, committed amount 233 * - malloc-ed amount, malloc count 234 * - arena amount, arena count 235 */ 236 // start reporting memory summary by memory type 237 void start_category_summary(); 238 void category_summary(MEMFLAGS type, size_t reserved_amt, size_t committed_amt, 239 size_t malloc_amt, size_t malloc_count, 240 size_t arena_amt, size_t arena_count); 241 242 void diff_category_summary(MEMFLAGS type, size_t cur_reserved_amt, 243 size_t cur_committed_amt, 244 size_t cur_malloc_amt, size_t cur_malloc_count, 245 size_t cur_arena_amt, size_t cur_arena_count, 246 int reserved_diff, int committed_diff, int malloc_diff, 247 int malloc_count_diff, int arena_diff, 248 int arena_count_diff); 249 250 void done_category_summary(); 251 252 /* 253 * Report callsite information 254 */ 255 void start_callsite(); 256 void malloc_callsite(address pc, size_t malloc_amt, size_t malloc_count); 257 void virtual_memory_callsite(address pc, size_t reserved_amt, size_t committed_amt); 258 259 void diff_malloc_callsite(address pc, size_t cur_malloc_amt, size_t cur_malloc_count, 260 int malloc_diff, int malloc_count_diff); 261 void diff_virtual_memory_callsite(address pc, size_t cur_reserved_amt, size_t cur_committed_amt, 262 int reserved_diff, int committed_diff); 263 264 void done_callsite(); 265}; 266 267 268#endif // SHARE_VM_SERVICES_MEM_REPORTER_HPP 269