| 1 | /* |
| 2 | * Copyright (c) 2014, 2018, 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 | #include "precompiled.hpp" |
| 26 | #include "gc/shared/stringdedup/stringDedupStat.hpp" |
| 27 | #include "logging/log.hpp" |
| 28 | |
| 29 | StringDedupStat::StringDedupStat() : |
| 30 | _inspected(0), |
| 31 | _skipped(0), |
| 32 | _hashed(0), |
| 33 | _known(0), |
| 34 | _new(0), |
| 35 | _new_bytes(0), |
| 36 | _deduped(0), |
| 37 | _deduped_bytes(0), |
| 38 | _idle(0), |
| 39 | _exec(0), |
| 40 | _block(0), |
| 41 | _start_concurrent(0.0), |
| 42 | _end_concurrent(0.0), |
| 43 | _start_phase(0.0), |
| 44 | _idle_elapsed(0.0), |
| 45 | _exec_elapsed(0.0), |
| 46 | _block_elapsed(0.0) { |
| 47 | } |
| 48 | |
| 49 | void StringDedupStat::add(const StringDedupStat* const stat) { |
| 50 | _inspected += stat->_inspected; |
| 51 | _skipped += stat->_skipped; |
| 52 | _hashed += stat->_hashed; |
| 53 | _known += stat->_known; |
| 54 | _new += stat->_new; |
| 55 | _new_bytes += stat->_new_bytes; |
| 56 | _deduped += stat->_deduped; |
| 57 | _deduped_bytes += stat->_deduped_bytes; |
| 58 | _idle += stat->_idle; |
| 59 | _exec += stat->_exec; |
| 60 | _block += stat->_block; |
| 61 | _idle_elapsed += stat->_idle_elapsed; |
| 62 | _exec_elapsed += stat->_exec_elapsed; |
| 63 | _block_elapsed += stat->_block_elapsed; |
| 64 | } |
| 65 | |
| 66 | void StringDedupStat::print_start(const StringDedupStat* last_stat) { |
| 67 | log_info(gc, stringdedup)( |
| 68 | "Concurrent String Deduplication (" STRDEDUP_TIME_FORMAT ")" , |
| 69 | STRDEDUP_TIME_PARAM(last_stat->_start_concurrent)); |
| 70 | } |
| 71 | |
| 72 | void StringDedupStat::print_end(const StringDedupStat* last_stat, const StringDedupStat* total_stat) { |
| 73 | double total_deduped_bytes_percent = 0.0; |
| 74 | |
| 75 | if (total_stat->_new_bytes > 0) { |
| 76 | // Avoid division by zero |
| 77 | total_deduped_bytes_percent = percent_of(total_stat->_deduped_bytes, total_stat->_new_bytes); |
| 78 | } |
| 79 | |
| 80 | log_info(gc, stringdedup)( |
| 81 | "Concurrent String Deduplication " |
| 82 | STRDEDUP_BYTES_FORMAT_NS "->" STRDEDUP_BYTES_FORMAT_NS "(" STRDEDUP_BYTES_FORMAT_NS ") " |
| 83 | "avg " STRDEDUP_PERCENT_FORMAT_NS " " |
| 84 | "(" STRDEDUP_TIME_FORMAT ", " STRDEDUP_TIME_FORMAT ") " STRDEDUP_TIME_FORMAT_MS, |
| 85 | STRDEDUP_BYTES_PARAM(last_stat->_new_bytes), |
| 86 | STRDEDUP_BYTES_PARAM(last_stat->_new_bytes - last_stat->_deduped_bytes), |
| 87 | STRDEDUP_BYTES_PARAM(last_stat->_deduped_bytes), |
| 88 | total_deduped_bytes_percent, |
| 89 | STRDEDUP_TIME_PARAM(last_stat->_start_concurrent), |
| 90 | STRDEDUP_TIME_PARAM(last_stat->_end_concurrent), |
| 91 | STRDEDUP_TIME_PARAM_MS(last_stat->_exec_elapsed)); |
| 92 | } |
| 93 | |
| 94 | void StringDedupStat::reset() { |
| 95 | _inspected = 0; |
| 96 | _skipped = 0; |
| 97 | _hashed = 0; |
| 98 | _known = 0; |
| 99 | _new = 0; |
| 100 | _new_bytes = 0; |
| 101 | _deduped = 0; |
| 102 | _deduped_bytes = 0; |
| 103 | _idle = 0; |
| 104 | _exec = 0; |
| 105 | _block = 0; |
| 106 | _start_concurrent = 0.0; |
| 107 | _end_concurrent = 0.0; |
| 108 | _start_phase = 0.0; |
| 109 | _idle_elapsed = 0.0; |
| 110 | _exec_elapsed = 0.0; |
| 111 | _block_elapsed = 0.0; |
| 112 | } |
| 113 | |
| 114 | void StringDedupStat::print_statistics(bool total) const { |
| 115 | double skipped_percent = percent_of(_skipped, _inspected); |
| 116 | double hashed_percent = percent_of(_hashed, _inspected); |
| 117 | double known_percent = percent_of(_known, _inspected); |
| 118 | double new_percent = percent_of(_new, _inspected); |
| 119 | double deduped_percent = percent_of(_deduped, _new); |
| 120 | double deduped_bytes_percent = percent_of(_deduped_bytes, _new_bytes); |
| 121 | /* |
| 122 | double deduped_young_percent = percent_of(stat._deduped_young, stat._deduped); |
| 123 | double deduped_young_bytes_percent = percent_of(stat._deduped_young_bytes, stat._deduped_bytes); |
| 124 | double deduped_old_percent = percent_of(stat._deduped_old, stat._deduped); |
| 125 | double deduped_old_bytes_percent = percent_of(stat._deduped_old_bytes, stat._deduped_bytes); |
| 126 | */ |
| 127 | if (total) { |
| 128 | log_debug(gc, stringdedup)( |
| 129 | " Total Exec: " UINTX_FORMAT "/" STRDEDUP_TIME_FORMAT_MS |
| 130 | ", Idle: " UINTX_FORMAT "/" STRDEDUP_TIME_FORMAT_MS |
| 131 | ", Blocked: " UINTX_FORMAT "/" STRDEDUP_TIME_FORMAT_MS, |
| 132 | _exec, STRDEDUP_TIME_PARAM_MS(_exec_elapsed), |
| 133 | _idle, STRDEDUP_TIME_PARAM_MS(_idle_elapsed), |
| 134 | _block, STRDEDUP_TIME_PARAM_MS(_block_elapsed)); |
| 135 | } else { |
| 136 | log_debug(gc, stringdedup)( |
| 137 | " Last Exec: " STRDEDUP_TIME_FORMAT_MS |
| 138 | ", Idle: " STRDEDUP_TIME_FORMAT_MS |
| 139 | ", Blocked: " UINTX_FORMAT "/" STRDEDUP_TIME_FORMAT_MS, |
| 140 | STRDEDUP_TIME_PARAM_MS(_exec_elapsed), |
| 141 | STRDEDUP_TIME_PARAM_MS(_idle_elapsed), |
| 142 | _block, STRDEDUP_TIME_PARAM_MS(_block_elapsed)); |
| 143 | } |
| 144 | log_debug(gc, stringdedup)(" Inspected: " STRDEDUP_OBJECTS_FORMAT, _inspected); |
| 145 | log_debug(gc, stringdedup)(" Skipped: " STRDEDUP_OBJECTS_FORMAT "(" STRDEDUP_PERCENT_FORMAT ")" , _skipped, skipped_percent); |
| 146 | log_debug(gc, stringdedup)(" Hashed: " STRDEDUP_OBJECTS_FORMAT "(" STRDEDUP_PERCENT_FORMAT ")" , _hashed, hashed_percent); |
| 147 | log_debug(gc, stringdedup)(" Known: " STRDEDUP_OBJECTS_FORMAT "(" STRDEDUP_PERCENT_FORMAT ")" , _known, known_percent); |
| 148 | log_debug(gc, stringdedup)(" New: " STRDEDUP_OBJECTS_FORMAT "(" STRDEDUP_PERCENT_FORMAT ") " STRDEDUP_BYTES_FORMAT, |
| 149 | _new, new_percent, STRDEDUP_BYTES_PARAM(_new_bytes)); |
| 150 | log_debug(gc, stringdedup)(" Deduplicated: " STRDEDUP_OBJECTS_FORMAT "(" STRDEDUP_PERCENT_FORMAT ") " STRDEDUP_BYTES_FORMAT "(" STRDEDUP_PERCENT_FORMAT ")" , |
| 151 | _deduped, deduped_percent, STRDEDUP_BYTES_PARAM(_deduped_bytes), deduped_bytes_percent); |
| 152 | } |
| 153 | |