Tue, 19 Aug 2014 02:05:49 -0700
8044406: JVM crash with JDK8 (build 1.8.0-b132) with G1 GC
Summary: Fill the last card that has been allocated into with a dummy object
Reviewed-by: tschatzl, mgerdin
aoqi@0 | 1 | /* |
aoqi@0 | 2 | * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. |
aoqi@0 | 3 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
aoqi@0 | 4 | * |
aoqi@0 | 5 | * This code is free software; you can redistribute it and/or modify it |
aoqi@0 | 6 | * under the terms of the GNU General Public License version 2 only, as |
aoqi@0 | 7 | * published by the Free Software Foundation. |
aoqi@0 | 8 | * |
aoqi@0 | 9 | * This code is distributed in the hope that it will be useful, but WITHOUT |
aoqi@0 | 10 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
aoqi@0 | 11 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
aoqi@0 | 12 | * version 2 for more details (a copy is included in the LICENSE file that |
aoqi@0 | 13 | * accompanied this code). |
aoqi@0 | 14 | * |
aoqi@0 | 15 | * You should have received a copy of the GNU General Public License version |
aoqi@0 | 16 | * 2 along with this work; if not, write to the Free Software Foundation, |
aoqi@0 | 17 | * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
aoqi@0 | 18 | * |
aoqi@0 | 19 | * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
aoqi@0 | 20 | * or visit www.oracle.com if you need additional information or have any |
aoqi@0 | 21 | * questions. |
aoqi@0 | 22 | * |
aoqi@0 | 23 | */ |
aoqi@0 | 24 | |
aoqi@0 | 25 | #include "precompiled.hpp" |
aoqi@0 | 26 | #include "gc_implementation/g1/g1StringDedupStat.hpp" |
aoqi@0 | 27 | |
aoqi@0 | 28 | G1StringDedupStat::G1StringDedupStat() : |
aoqi@0 | 29 | _inspected(0), |
aoqi@0 | 30 | _skipped(0), |
aoqi@0 | 31 | _hashed(0), |
aoqi@0 | 32 | _known(0), |
aoqi@0 | 33 | _new(0), |
aoqi@0 | 34 | _new_bytes(0), |
aoqi@0 | 35 | _deduped(0), |
aoqi@0 | 36 | _deduped_bytes(0), |
aoqi@0 | 37 | _deduped_young(0), |
aoqi@0 | 38 | _deduped_young_bytes(0), |
aoqi@0 | 39 | _deduped_old(0), |
aoqi@0 | 40 | _deduped_old_bytes(0), |
aoqi@0 | 41 | _idle(0), |
aoqi@0 | 42 | _exec(0), |
aoqi@0 | 43 | _block(0), |
aoqi@0 | 44 | _start(0.0), |
aoqi@0 | 45 | _idle_elapsed(0.0), |
aoqi@0 | 46 | _exec_elapsed(0.0), |
aoqi@0 | 47 | _block_elapsed(0.0) { |
aoqi@0 | 48 | } |
aoqi@0 | 49 | |
aoqi@0 | 50 | void G1StringDedupStat::add(const G1StringDedupStat& stat) { |
aoqi@0 | 51 | _inspected += stat._inspected; |
aoqi@0 | 52 | _skipped += stat._skipped; |
aoqi@0 | 53 | _hashed += stat._hashed; |
aoqi@0 | 54 | _known += stat._known; |
aoqi@0 | 55 | _new += stat._new; |
aoqi@0 | 56 | _new_bytes += stat._new_bytes; |
aoqi@0 | 57 | _deduped += stat._deduped; |
aoqi@0 | 58 | _deduped_bytes += stat._deduped_bytes; |
aoqi@0 | 59 | _deduped_young += stat._deduped_young; |
aoqi@0 | 60 | _deduped_young_bytes += stat._deduped_young_bytes; |
aoqi@0 | 61 | _deduped_old += stat._deduped_old; |
aoqi@0 | 62 | _deduped_old_bytes += stat._deduped_old_bytes; |
aoqi@0 | 63 | _idle += stat._idle; |
aoqi@0 | 64 | _exec += stat._exec; |
aoqi@0 | 65 | _block += stat._block; |
aoqi@0 | 66 | _idle_elapsed += stat._idle_elapsed; |
aoqi@0 | 67 | _exec_elapsed += stat._exec_elapsed; |
aoqi@0 | 68 | _block_elapsed += stat._block_elapsed; |
aoqi@0 | 69 | } |
aoqi@0 | 70 | |
aoqi@0 | 71 | void G1StringDedupStat::print_summary(outputStream* st, const G1StringDedupStat& last_stat, const G1StringDedupStat& total_stat) { |
aoqi@0 | 72 | double total_deduped_bytes_percent = 0.0; |
aoqi@0 | 73 | |
aoqi@0 | 74 | if (total_stat._new_bytes > 0) { |
aoqi@0 | 75 | // Avoid division by zero |
aoqi@0 | 76 | total_deduped_bytes_percent = (double)total_stat._deduped_bytes / (double)total_stat._new_bytes * 100.0; |
aoqi@0 | 77 | } |
aoqi@0 | 78 | |
aoqi@0 | 79 | st->date_stamp(PrintGCDateStamps); |
aoqi@0 | 80 | st->stamp(PrintGCTimeStamps); |
aoqi@0 | 81 | st->print_cr( |
aoqi@0 | 82 | "[GC concurrent-string-deduplication, " |
aoqi@0 | 83 | G1_STRDEDUP_BYTES_FORMAT_NS"->"G1_STRDEDUP_BYTES_FORMAT_NS"("G1_STRDEDUP_BYTES_FORMAT_NS"), avg " |
aoqi@0 | 84 | G1_STRDEDUP_PERCENT_FORMAT_NS", "G1_STRDEDUP_TIME_FORMAT"]", |
aoqi@0 | 85 | G1_STRDEDUP_BYTES_PARAM(last_stat._new_bytes), |
aoqi@0 | 86 | G1_STRDEDUP_BYTES_PARAM(last_stat._new_bytes - last_stat._deduped_bytes), |
aoqi@0 | 87 | G1_STRDEDUP_BYTES_PARAM(last_stat._deduped_bytes), |
aoqi@0 | 88 | total_deduped_bytes_percent, |
aoqi@0 | 89 | last_stat._exec_elapsed); |
aoqi@0 | 90 | } |
aoqi@0 | 91 | |
aoqi@0 | 92 | void G1StringDedupStat::print_statistics(outputStream* st, const G1StringDedupStat& stat, bool total) { |
aoqi@0 | 93 | double young_percent = 0.0; |
aoqi@0 | 94 | double old_percent = 0.0; |
aoqi@0 | 95 | double skipped_percent = 0.0; |
aoqi@0 | 96 | double hashed_percent = 0.0; |
aoqi@0 | 97 | double known_percent = 0.0; |
aoqi@0 | 98 | double new_percent = 0.0; |
aoqi@0 | 99 | double deduped_percent = 0.0; |
aoqi@0 | 100 | double deduped_bytes_percent = 0.0; |
aoqi@0 | 101 | double deduped_young_percent = 0.0; |
aoqi@0 | 102 | double deduped_young_bytes_percent = 0.0; |
aoqi@0 | 103 | double deduped_old_percent = 0.0; |
aoqi@0 | 104 | double deduped_old_bytes_percent = 0.0; |
aoqi@0 | 105 | |
aoqi@0 | 106 | if (stat._inspected > 0) { |
aoqi@0 | 107 | // Avoid division by zero |
aoqi@0 | 108 | skipped_percent = (double)stat._skipped / (double)stat._inspected * 100.0; |
aoqi@0 | 109 | hashed_percent = (double)stat._hashed / (double)stat._inspected * 100.0; |
aoqi@0 | 110 | known_percent = (double)stat._known / (double)stat._inspected * 100.0; |
aoqi@0 | 111 | new_percent = (double)stat._new / (double)stat._inspected * 100.0; |
aoqi@0 | 112 | } |
aoqi@0 | 113 | |
aoqi@0 | 114 | if (stat._new > 0) { |
aoqi@0 | 115 | // Avoid division by zero |
aoqi@0 | 116 | deduped_percent = (double)stat._deduped / (double)stat._new * 100.0; |
aoqi@0 | 117 | } |
aoqi@0 | 118 | |
aoqi@0 | 119 | if (stat._deduped > 0) { |
aoqi@0 | 120 | // Avoid division by zero |
aoqi@0 | 121 | deduped_young_percent = (double)stat._deduped_young / (double)stat._deduped * 100.0; |
aoqi@0 | 122 | deduped_old_percent = (double)stat._deduped_old / (double)stat._deduped * 100.0; |
aoqi@0 | 123 | } |
aoqi@0 | 124 | |
aoqi@0 | 125 | if (stat._new_bytes > 0) { |
aoqi@0 | 126 | // Avoid division by zero |
aoqi@0 | 127 | deduped_bytes_percent = (double)stat._deduped_bytes / (double)stat._new_bytes * 100.0; |
aoqi@0 | 128 | } |
aoqi@0 | 129 | |
aoqi@0 | 130 | if (stat._deduped_bytes > 0) { |
aoqi@0 | 131 | // Avoid division by zero |
aoqi@0 | 132 | deduped_young_bytes_percent = (double)stat._deduped_young_bytes / (double)stat._deduped_bytes * 100.0; |
aoqi@0 | 133 | deduped_old_bytes_percent = (double)stat._deduped_old_bytes / (double)stat._deduped_bytes * 100.0; |
aoqi@0 | 134 | } |
aoqi@0 | 135 | |
aoqi@0 | 136 | if (total) { |
aoqi@0 | 137 | st->print_cr( |
aoqi@0 | 138 | " [Total Exec: "UINTX_FORMAT"/"G1_STRDEDUP_TIME_FORMAT", Idle: "UINTX_FORMAT"/"G1_STRDEDUP_TIME_FORMAT", Blocked: "UINTX_FORMAT"/"G1_STRDEDUP_TIME_FORMAT"]", |
aoqi@0 | 139 | stat._exec, stat._exec_elapsed, stat._idle, stat._idle_elapsed, stat._block, stat._block_elapsed); |
aoqi@0 | 140 | } else { |
aoqi@0 | 141 | st->print_cr( |
aoqi@0 | 142 | " [Last Exec: "G1_STRDEDUP_TIME_FORMAT", Idle: "G1_STRDEDUP_TIME_FORMAT", Blocked: "UINTX_FORMAT"/"G1_STRDEDUP_TIME_FORMAT"]", |
aoqi@0 | 143 | stat._exec_elapsed, stat._idle_elapsed, stat._block, stat._block_elapsed); |
aoqi@0 | 144 | } |
aoqi@0 | 145 | st->print_cr( |
aoqi@0 | 146 | " [Inspected: "G1_STRDEDUP_OBJECTS_FORMAT"]\n" |
aoqi@0 | 147 | " [Skipped: "G1_STRDEDUP_OBJECTS_FORMAT"("G1_STRDEDUP_PERCENT_FORMAT")]\n" |
aoqi@0 | 148 | " [Hashed: "G1_STRDEDUP_OBJECTS_FORMAT"("G1_STRDEDUP_PERCENT_FORMAT")]\n" |
aoqi@0 | 149 | " [Known: "G1_STRDEDUP_OBJECTS_FORMAT"("G1_STRDEDUP_PERCENT_FORMAT")]\n" |
aoqi@0 | 150 | " [New: "G1_STRDEDUP_OBJECTS_FORMAT"("G1_STRDEDUP_PERCENT_FORMAT") "G1_STRDEDUP_BYTES_FORMAT"]\n" |
aoqi@0 | 151 | " [Deduplicated: "G1_STRDEDUP_OBJECTS_FORMAT"("G1_STRDEDUP_PERCENT_FORMAT") "G1_STRDEDUP_BYTES_FORMAT"("G1_STRDEDUP_PERCENT_FORMAT")]\n" |
aoqi@0 | 152 | " [Young: "G1_STRDEDUP_OBJECTS_FORMAT"("G1_STRDEDUP_PERCENT_FORMAT") "G1_STRDEDUP_BYTES_FORMAT"("G1_STRDEDUP_PERCENT_FORMAT")]\n" |
aoqi@0 | 153 | " [Old: "G1_STRDEDUP_OBJECTS_FORMAT"("G1_STRDEDUP_PERCENT_FORMAT") "G1_STRDEDUP_BYTES_FORMAT"("G1_STRDEDUP_PERCENT_FORMAT")]", |
aoqi@0 | 154 | stat._inspected, |
aoqi@0 | 155 | stat._skipped, skipped_percent, |
aoqi@0 | 156 | stat._hashed, hashed_percent, |
aoqi@0 | 157 | stat._known, known_percent, |
aoqi@0 | 158 | stat._new, new_percent, G1_STRDEDUP_BYTES_PARAM(stat._new_bytes), |
aoqi@0 | 159 | stat._deduped, deduped_percent, G1_STRDEDUP_BYTES_PARAM(stat._deduped_bytes), deduped_bytes_percent, |
aoqi@0 | 160 | stat._deduped_young, deduped_young_percent, G1_STRDEDUP_BYTES_PARAM(stat._deduped_young_bytes), deduped_young_bytes_percent, |
aoqi@0 | 161 | stat._deduped_old, deduped_old_percent, G1_STRDEDUP_BYTES_PARAM(stat._deduped_old_bytes), deduped_old_bytes_percent); |
aoqi@0 | 162 | } |