< prev index next >
src/hotspot/share/utilities/ostream.cpp
Print this page
rev 49873 : [mq]: 8201572-improve-metaspace-reporting
*** 204,213 ****
--- 204,217 ----
void outputStream::cr() {
this->write("\n", 1);
}
+ void outputStream::cr_indent() {
+ cr(); indent();
+ }
+
void outputStream::stamp() {
if (! _stamp.is_updated()) {
_stamp.update(); // start at 0 on first call to stamp()
}
*** 301,310 ****
--- 305,396 ----
cr();
}
}
}
+ // Print a human readable size.
+ // byte_size: size, in bytes, to be printed.
+ // scale: one of 1 (byte-wise printing), sizeof(word) (word-size printing), K, M, G (scaled by KB, MB, GB respectively,
+ // or 0, which means the best scale is choosen dynamically.
+ // width: printing width.
+ void outputStream::print_human_readable_size(size_t byte_size, size_t scale, int width) {
+ if (scale == 0) {
+ // Dynamic mode. Choose scale for this value.
+ if (byte_size == 0) {
+ // Zero values are printed as bytes.
+ scale = 1;
+ } else {
+ if (byte_size >= G) {
+ scale = G;
+ } else if (byte_size >= M) {
+ scale = M;
+ } else if (byte_size >= K) {
+ scale = K;
+ } else {
+ scale = 1;
+ }
+ }
+ return print_human_readable_size(byte_size, scale, width);
+ }
+
+ #ifdef ASSERT
+ assert(scale == 1 || scale == BytesPerWord || scale == K || scale == M || scale == G, "Invalid scale");
+ // Special case: printing wordsize should only be done with word-sized values
+ if (scale == BytesPerWord) {
+ assert(byte_size % BytesPerWord == 0, "not word sized");
+ }
+ #endif
+
+ if (scale == 1) {
+ print("%*" PRIuPTR " bytes", width, byte_size);
+ } else if (scale == BytesPerWord) {
+ print("%*" PRIuPTR " words", width, byte_size / BytesPerWord);
+ } else {
+ const char* display_unit = "";
+ switch(scale) {
+ case 1: display_unit = "bytes"; break;
+ case BytesPerWord: display_unit = "words"; break;
+ case K: display_unit = "KB"; break;
+ case M: display_unit = "MB"; break;
+ case G: display_unit = "GB"; break;
+ default:
+ ShouldNotReachHere();
+ }
+ float display_value = (float) byte_size / scale;
+ // Since we use width to display a number with two trailing digits, increase it a bit.
+ width += 3;
+ // Prevent very small but non-null values showing up as 0.00.
+ if (byte_size > 0 && display_value < 0.01f) {
+ print("%*s %s", width, "<0.01", display_unit);
+ } else {
+ print("%*.2f %s", width, display_value, display_unit);
+ }
+ }
+ }
+
+ // Prints a percentage value. Values smaller than 1% but not 0 are displayed as "<1%", values
+ // larger than 99% but not 100% are displayed as ">100%".
+ void outputStream::print_percentage(size_t total, size_t part) {
+ if (total == 0) {
+ print(" ?%%");
+ } else if (part == 0) {
+ print(" 0%%");
+ } else if (part == total) {
+ print("100%%");
+ } else {
+ // Note: clearly print very-small-but-not-0% and very-large-but-not-100% percentages.
+ float p = ((float)part / total) * 100.0f;
+ if (p < 1.0f) {
+ print(" <1%%");
+ } else if (p > 99.0f){
+ print(">99%%");
+ } else {
+ print("%3.0f%%", p);
+ }
+ }
+ }
+
stringStream::stringStream(size_t initial_size) : outputStream() {
buffer_length = initial_size;
buffer = NEW_RESOURCE_ARRAY(char, buffer_length);
buffer_pos = 0;
buffer_fixed = false;
< prev index next >