g1StringDedupStat.cpp revision 11575:48e9e7db6944
1/* 2 * Copyright (c) 2014, 2016, 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/g1/g1StringDedupStat.hpp" 27#include "logging/log.hpp" 28 29G1StringDedupStat::G1StringDedupStat() : 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 _deduped_young(0), 39 _deduped_young_bytes(0), 40 _deduped_old(0), 41 _deduped_old_bytes(0), 42 _idle(0), 43 _exec(0), 44 _block(0), 45 _start_concurrent(0.0), 46 _end_concurrent(0.0), 47 _start_phase(0.0), 48 _idle_elapsed(0.0), 49 _exec_elapsed(0.0), 50 _block_elapsed(0.0) { 51} 52 53void G1StringDedupStat::add(const G1StringDedupStat& stat) { 54 _inspected += stat._inspected; 55 _skipped += stat._skipped; 56 _hashed += stat._hashed; 57 _known += stat._known; 58 _new += stat._new; 59 _new_bytes += stat._new_bytes; 60 _deduped += stat._deduped; 61 _deduped_bytes += stat._deduped_bytes; 62 _deduped_young += stat._deduped_young; 63 _deduped_young_bytes += stat._deduped_young_bytes; 64 _deduped_old += stat._deduped_old; 65 _deduped_old_bytes += stat._deduped_old_bytes; 66 _idle += stat._idle; 67 _exec += stat._exec; 68 _block += stat._block; 69 _idle_elapsed += stat._idle_elapsed; 70 _exec_elapsed += stat._exec_elapsed; 71 _block_elapsed += stat._block_elapsed; 72} 73 74void G1StringDedupStat::print_start(const G1StringDedupStat& last_stat) { 75 log_info(gc, stringdedup)( 76 "Concurrent String Deduplication (" G1_STRDEDUP_TIME_FORMAT ")", 77 G1_STRDEDUP_TIME_PARAM(last_stat._start_concurrent)); 78} 79 80void G1StringDedupStat::print_end(const G1StringDedupStat& last_stat, const G1StringDedupStat& total_stat) { 81 double total_deduped_bytes_percent = 0.0; 82 83 if (total_stat._new_bytes > 0) { 84 // Avoid division by zero 85 total_deduped_bytes_percent = (double)total_stat._deduped_bytes / (double)total_stat._new_bytes * 100.0; 86 } 87 88 log_info(gc, stringdedup)( 89 "Concurrent String Deduplication " 90 G1_STRDEDUP_BYTES_FORMAT_NS "->" G1_STRDEDUP_BYTES_FORMAT_NS "(" G1_STRDEDUP_BYTES_FORMAT_NS ") " 91 "avg " G1_STRDEDUP_PERCENT_FORMAT_NS " " 92 "(" G1_STRDEDUP_TIME_FORMAT ", " G1_STRDEDUP_TIME_FORMAT ") " G1_STRDEDUP_TIME_FORMAT_MS, 93 G1_STRDEDUP_BYTES_PARAM(last_stat._new_bytes), 94 G1_STRDEDUP_BYTES_PARAM(last_stat._new_bytes - last_stat._deduped_bytes), 95 G1_STRDEDUP_BYTES_PARAM(last_stat._deduped_bytes), 96 total_deduped_bytes_percent, 97 G1_STRDEDUP_TIME_PARAM(last_stat._start_concurrent), 98 G1_STRDEDUP_TIME_PARAM(last_stat._end_concurrent), 99 G1_STRDEDUP_TIME_PARAM_MS(last_stat._exec_elapsed)); 100} 101 102void G1StringDedupStat::print_statistics(const G1StringDedupStat& stat, bool total) { 103 double young_percent = 0.0; 104 double old_percent = 0.0; 105 double skipped_percent = 0.0; 106 double hashed_percent = 0.0; 107 double known_percent = 0.0; 108 double new_percent = 0.0; 109 double deduped_percent = 0.0; 110 double deduped_bytes_percent = 0.0; 111 double deduped_young_percent = 0.0; 112 double deduped_young_bytes_percent = 0.0; 113 double deduped_old_percent = 0.0; 114 double deduped_old_bytes_percent = 0.0; 115 116 if (stat._inspected > 0) { 117 // Avoid division by zero 118 skipped_percent = (double)stat._skipped / (double)stat._inspected * 100.0; 119 hashed_percent = (double)stat._hashed / (double)stat._inspected * 100.0; 120 known_percent = (double)stat._known / (double)stat._inspected * 100.0; 121 new_percent = (double)stat._new / (double)stat._inspected * 100.0; 122 } 123 124 if (stat._new > 0) { 125 // Avoid division by zero 126 deduped_percent = (double)stat._deduped / (double)stat._new * 100.0; 127 } 128 129 if (stat._deduped > 0) { 130 // Avoid division by zero 131 deduped_young_percent = (double)stat._deduped_young / (double)stat._deduped * 100.0; 132 deduped_old_percent = (double)stat._deduped_old / (double)stat._deduped * 100.0; 133 } 134 135 if (stat._new_bytes > 0) { 136 // Avoid division by zero 137 deduped_bytes_percent = (double)stat._deduped_bytes / (double)stat._new_bytes * 100.0; 138 } 139 140 if (stat._deduped_bytes > 0) { 141 // Avoid division by zero 142 deduped_young_bytes_percent = (double)stat._deduped_young_bytes / (double)stat._deduped_bytes * 100.0; 143 deduped_old_bytes_percent = (double)stat._deduped_old_bytes / (double)stat._deduped_bytes * 100.0; 144 } 145 146 if (total) { 147 log_debug(gc, stringdedup)( 148 " Total Exec: " UINTX_FORMAT "/" G1_STRDEDUP_TIME_FORMAT_MS 149 ", Idle: " UINTX_FORMAT "/" G1_STRDEDUP_TIME_FORMAT_MS 150 ", Blocked: " UINTX_FORMAT "/" G1_STRDEDUP_TIME_FORMAT_MS, 151 stat._exec, G1_STRDEDUP_TIME_PARAM_MS(stat._exec_elapsed), 152 stat._idle, G1_STRDEDUP_TIME_PARAM_MS(stat._idle_elapsed), 153 stat._block, G1_STRDEDUP_TIME_PARAM_MS(stat._block_elapsed)); 154 } else { 155 log_debug(gc, stringdedup)( 156 " Last Exec: " G1_STRDEDUP_TIME_FORMAT_MS 157 ", Idle: " G1_STRDEDUP_TIME_FORMAT_MS 158 ", Blocked: " UINTX_FORMAT "/" G1_STRDEDUP_TIME_FORMAT_MS, 159 G1_STRDEDUP_TIME_PARAM_MS(stat._exec_elapsed), 160 G1_STRDEDUP_TIME_PARAM_MS(stat._idle_elapsed), 161 stat._block, G1_STRDEDUP_TIME_PARAM_MS(stat._block_elapsed)); 162 } 163 log_debug(gc, stringdedup)(" Inspected: " G1_STRDEDUP_OBJECTS_FORMAT, stat._inspected); 164 log_debug(gc, stringdedup)(" Skipped: " G1_STRDEDUP_OBJECTS_FORMAT "(" G1_STRDEDUP_PERCENT_FORMAT ")", stat._skipped, skipped_percent); 165 log_debug(gc, stringdedup)(" Hashed: " G1_STRDEDUP_OBJECTS_FORMAT "(" G1_STRDEDUP_PERCENT_FORMAT ")", stat._hashed, hashed_percent); 166 log_debug(gc, stringdedup)(" Known: " G1_STRDEDUP_OBJECTS_FORMAT "(" G1_STRDEDUP_PERCENT_FORMAT ")", stat._known, known_percent); 167 log_debug(gc, stringdedup)(" New: " G1_STRDEDUP_OBJECTS_FORMAT "(" G1_STRDEDUP_PERCENT_FORMAT ") " G1_STRDEDUP_BYTES_FORMAT, 168 stat._new, new_percent, G1_STRDEDUP_BYTES_PARAM(stat._new_bytes)); 169 log_debug(gc, stringdedup)(" Deduplicated: " G1_STRDEDUP_OBJECTS_FORMAT "(" G1_STRDEDUP_PERCENT_FORMAT ") " G1_STRDEDUP_BYTES_FORMAT "(" G1_STRDEDUP_PERCENT_FORMAT ")", 170 stat._deduped, deduped_percent, G1_STRDEDUP_BYTES_PARAM(stat._deduped_bytes), deduped_bytes_percent); 171 log_debug(gc, stringdedup)(" Young: " G1_STRDEDUP_OBJECTS_FORMAT "(" G1_STRDEDUP_PERCENT_FORMAT ") " G1_STRDEDUP_BYTES_FORMAT "(" G1_STRDEDUP_PERCENT_FORMAT ")", 172 stat._deduped_young, deduped_young_percent, G1_STRDEDUP_BYTES_PARAM(stat._deduped_young_bytes), deduped_young_bytes_percent); 173 log_debug(gc, stringdedup)(" Old: " G1_STRDEDUP_OBJECTS_FORMAT "(" G1_STRDEDUP_PERCENT_FORMAT ") " G1_STRDEDUP_BYTES_FORMAT "(" G1_STRDEDUP_PERCENT_FORMAT ")", 174 stat._deduped_old, deduped_old_percent, G1_STRDEDUP_BYTES_PARAM(stat._deduped_old_bytes), deduped_old_bytes_percent); 175} 176