memReporter.hpp revision 3730:fb19af007ffc
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#if INCLUDE_NMT 34 35/* 36 * MemBaselineReporter reports data to this outputer class, 37 * ReportOutputer is responsible for format, store and redirect 38 * the data to the final destination. 39 */ 40class BaselineOutputer : public StackObj { 41 public: 42 // start to report memory usage in specified scale. 43 // if report_diff = true, the reporter reports baseline comparison 44 // information. 45 46 virtual void start(size_t scale, bool report_diff = false) = 0; 47 // Done reporting 48 virtual void done() = 0; 49 50 /* report baseline summary information */ 51 virtual void total_usage(size_t total_reserved, 52 size_t total_committed) = 0; 53 virtual void num_of_classes(size_t classes) = 0; 54 virtual void num_of_threads(size_t threads) = 0; 55 56 virtual void thread_info(size_t stack_reserved_amt, size_t stack_committed_amt) = 0; 57 58 /* report baseline summary comparison */ 59 virtual void diff_total_usage(size_t total_reserved, 60 size_t total_committed, 61 int reserved_diff, 62 int committed_diff) = 0; 63 virtual void diff_num_of_classes(size_t classes, int diff) = 0; 64 virtual void diff_num_of_threads(size_t threads, int diff) = 0; 65 66 virtual void diff_thread_info(size_t stack_reserved, size_t stack_committed, 67 int stack_reserved_diff, int stack_committed_diff) = 0; 68 69 70 /* 71 * memory summary by memory types. 72 * for each memory type, following summaries are reported: 73 * - reserved amount, committed amount 74 * - malloc'd amount, malloc count 75 * - arena amount, arena count 76 */ 77 78 // start reporting memory summary by memory type 79 virtual void start_category_summary() = 0; 80 81 virtual void category_summary(MEMFLAGS type, size_t reserved_amt, 82 size_t committed_amt, 83 size_t malloc_amt, size_t malloc_count, 84 size_t arena_amt, size_t arena_count) = 0; 85 86 virtual void diff_category_summary(MEMFLAGS type, size_t cur_reserved_amt, 87 size_t cur_committed_amt, 88 size_t cur_malloc_amt, size_t cur_malloc_count, 89 size_t cur_arena_amt, size_t cur_arena_count, 90 int reserved_diff, int committed_diff, int malloc_diff, 91 int malloc_count_diff, int arena_diff, 92 int arena_count_diff) = 0; 93 94 virtual void done_category_summary() = 0; 95 96 /* 97 * Report callsite information 98 */ 99 virtual void start_callsite() = 0; 100 virtual void malloc_callsite(address pc, size_t malloc_amt, size_t malloc_count) = 0; 101 virtual void virtual_memory_callsite(address pc, size_t reserved_amt, size_t committed_amt) = 0; 102 103 virtual void diff_malloc_callsite(address pc, size_t cur_malloc_amt, size_t cur_malloc_count, 104 int malloc_diff, int malloc_count_diff) = 0; 105 virtual void diff_virtual_memory_callsite(address pc, size_t cur_reserved_amt, size_t cur_committed_amt, 106 int reserved_diff, int committed_diff) = 0; 107 108 virtual void done_callsite() = 0; 109 110 // return current scale in "KB", "MB" or "GB" 111 static const char* memory_unit(size_t scale); 112}; 113 114/* 115 * This class reports processed data from a baseline or 116 * the changes between the two baseline. 117 */ 118class BaselineReporter : public StackObj { 119 private: 120 BaselineOutputer& _outputer; 121 size_t _scale; 122 123 public: 124 // construct a reporter that reports memory usage 125 // in specified scale 126 BaselineReporter(BaselineOutputer& outputer, size_t scale = K): 127 _outputer(outputer) { 128 _scale = scale; 129 } 130 virtual void report_baseline(const MemBaseline& baseline, bool summary_only = false); 131 virtual void diff_baselines(const MemBaseline& cur, const MemBaseline& prev, 132 bool summary_only = false); 133 134 void set_scale(size_t scale); 135 size_t scale() const { return _scale; } 136 137 private: 138 void report_summaries(const MemBaseline& baseline); 139 void report_callsites(const MemBaseline& baseline); 140 141 void diff_summaries(const MemBaseline& cur, const MemBaseline& prev); 142 void diff_callsites(const MemBaseline& cur, const MemBaseline& prev); 143 144 // calculate memory size in current memory scale 145 size_t amount_in_current_scale(size_t amt) const; 146 // diff two unsigned values in current memory scale 147 int diff_in_current_scale(size_t value1, size_t value2) const; 148 // diff two unsigned value 149 int diff(size_t value1, size_t value2) const; 150}; 151 152/* 153 * tty output implementation. Native memory tracking 154 * DCmd uses this outputer. 155 */ 156class BaselineTTYOutputer : public BaselineOutputer { 157 private: 158 size_t _scale; 159 160 size_t _num_of_classes; 161 size_t _num_of_threads; 162 size_t _thread_stack_reserved; 163 size_t _thread_stack_committed; 164 165 int _num_of_classes_diff; 166 int _num_of_threads_diff; 167 int _thread_stack_reserved_diff; 168 int _thread_stack_committed_diff; 169 170 outputStream* _output; 171 172 public: 173 BaselineTTYOutputer(outputStream* st) { 174 _scale = K; 175 _num_of_classes = 0; 176 _num_of_threads = 0; 177 _thread_stack_reserved = 0; 178 _thread_stack_committed = 0; 179 _num_of_classes_diff = 0; 180 _num_of_threads_diff = 0; 181 _thread_stack_reserved_diff = 0; 182 _thread_stack_committed_diff = 0; 183 _output = st; 184 } 185 186 // begin reporting memory usage in specified scale 187 void start(size_t scale, bool report_diff = false); 188 // done reporting 189 void done(); 190 191 // total memory usage 192 void total_usage(size_t total_reserved, 193 size_t total_committed); 194 // report total loaded classes 195 void num_of_classes(size_t classes) { 196 _num_of_classes = classes; 197 } 198 199 void num_of_threads(size_t threads) { 200 _num_of_threads = threads; 201 } 202 203 void thread_info(size_t stack_reserved_amt, size_t stack_committed_amt) { 204 _thread_stack_reserved = stack_reserved_amt; 205 _thread_stack_committed = stack_committed_amt; 206 } 207 208 void diff_total_usage(size_t total_reserved, 209 size_t total_committed, 210 int reserved_diff, 211 int committed_diff); 212 213 void diff_num_of_classes(size_t classes, int diff) { 214 _num_of_classes = classes; 215 _num_of_classes_diff = diff; 216 } 217 218 void diff_num_of_threads(size_t threads, int diff) { 219 _num_of_threads = threads; 220 _num_of_threads_diff = diff; 221 } 222 223 void diff_thread_info(size_t stack_reserved_amt, size_t stack_committed_amt, 224 int stack_reserved_diff, int stack_committed_diff) { 225 _thread_stack_reserved = stack_reserved_amt; 226 _thread_stack_committed = stack_committed_amt; 227 _thread_stack_reserved_diff = stack_reserved_diff; 228 _thread_stack_committed_diff = stack_committed_diff; 229 } 230 231 /* 232 * Report memory summary categoriuzed by memory types. 233 * For each memory type, following summaries are reported: 234 * - reserved amount, committed amount 235 * - malloc-ed amount, malloc count 236 * - arena amount, arena count 237 */ 238 // start reporting memory summary by memory type 239 void start_category_summary(); 240 void category_summary(MEMFLAGS type, size_t reserved_amt, size_t committed_amt, 241 size_t malloc_amt, size_t malloc_count, 242 size_t arena_amt, size_t arena_count); 243 244 void diff_category_summary(MEMFLAGS type, size_t cur_reserved_amt, 245 size_t cur_committed_amt, 246 size_t cur_malloc_amt, size_t cur_malloc_count, 247 size_t cur_arena_amt, size_t cur_arena_count, 248 int reserved_diff, int committed_diff, int malloc_diff, 249 int malloc_count_diff, int arena_diff, 250 int arena_count_diff); 251 252 void done_category_summary(); 253 254 /* 255 * Report callsite information 256 */ 257 void start_callsite(); 258 void malloc_callsite(address pc, size_t malloc_amt, size_t malloc_count); 259 void virtual_memory_callsite(address pc, size_t reserved_amt, size_t committed_amt); 260 261 void diff_malloc_callsite(address pc, size_t cur_malloc_amt, size_t cur_malloc_count, 262 int malloc_diff, int malloc_count_diff); 263 void diff_virtual_memory_callsite(address pc, size_t cur_reserved_amt, size_t cur_committed_amt, 264 int reserved_diff, int committed_diff); 265 266 void done_callsite(); 267}; 268 269 270#endif // INCLUDE_NMT 271 272#endif // SHARE_VM_SERVICES_MEM_REPORTER_HPP 273