# HG changeset patch # User brutisso # Date 1458566903 -3600 # Mon Mar 21 14:28:23 2016 +0100 # Node ID cb6920f225f21bf28987ac2f37860be98a8d9486 # Parent 0ff5753d78b98916b187a4b9c65ae3d32f005366 [mq]: ALLOC_TRACE_PRODUCT diff --git a/src/share/vm/gc/g1/g1AllocRegion.cpp b/src/share/vm/gc/g1/g1AllocRegion.cpp --- a/src/share/vm/gc/g1/g1AllocRegion.cpp +++ b/src/share/vm/gc/g1/g1AllocRegion.cpp @@ -26,6 +26,7 @@ #include "gc/g1/g1AllocRegion.inline.hpp" #include "gc/g1/g1EvacStats.inline.hpp" #include "gc/g1/g1CollectedHeap.inline.hpp" +#include "memory/resourceArea.hpp" #include "runtime/orderAccess.inline.hpp" G1CollectedHeap* G1AllocRegion::_g1h = NULL; @@ -194,44 +195,52 @@ return (alloc_region == _dummy_region) ? NULL : alloc_region; } -#if G1_ALLOC_REGION_TRACING +#ifndef PRODUCT void G1AllocRegion::trace(const char* str, size_t min_word_size, size_t desired_word_size, size_t actual_word_size, HeapWord* result) { // All the calls to trace that set either just the size or the size - // and the result are considered part of level 2 tracing and are - // skipped during level 1 tracing. - if ((actual_word_size == 0 && result == NULL) || (G1_ALLOC_REGION_TRACING > 1)) { - const size_t buffer_length = 128; - char hr_buffer[buffer_length]; - char rest_buffer[buffer_length]; + // and the result are considered part of detailed tracing and are + // skipped during other tracing. - HeapRegion* alloc_region = _alloc_region; - if (alloc_region == NULL) { - jio_snprintf(hr_buffer, buffer_length, "NULL"); - } else if (alloc_region == _dummy_region) { - jio_snprintf(hr_buffer, buffer_length, "DUMMY"); + if (!log_develop_is_enabled(Debug, gc, alloc, region)) { + return; + } + + bool detailed_info = log_develop_is_enabled(Trace, gc, alloc, region); + + if ((actual_word_size == 0 && result == NULL) || detailed_info) { + LogHandle(gc, alloc, region) log; + ResourceMark rm; + outputStream* out; + if (detailed_info) { + out = log.trace_stream(); } else { - jio_snprintf(hr_buffer, buffer_length, - HR_FORMAT, HR_FORMAT_PARAMS(alloc_region)); + out = log.debug_stream(); } - if (G1_ALLOC_REGION_TRACING > 1) { - if (result != NULL) { - jio_snprintf(rest_buffer, buffer_length, "min " SIZE_FORMAT " desired " SIZE_FORMAT " actual " SIZE_FORMAT " " PTR_FORMAT, - min_word_size, desired_word_size, actual_word_size, result); - } else if (min_word_size != 0) { - jio_snprintf(rest_buffer, buffer_length, "min " SIZE_FORMAT " desired " SIZE_FORMAT, min_word_size, desired_word_size); - } else { - jio_snprintf(rest_buffer, buffer_length, ""); - } + out->print("%s: %u ", _name, _count); + + if (_alloc_region == NULL) { + out->print("NULL"); + } else if (_alloc_region == _dummy_region) { + out->print("DUMMY"); } else { - jio_snprintf(rest_buffer, buffer_length, ""); + out->print(HR_FORMAT, HR_FORMAT_PARAMS(_alloc_region)); } - tty->print_cr("[%s] %u %s : %s %s", - _name, _count, hr_buffer, str, rest_buffer); + out->print(" : %s", str); + + if (detailed_info) { + if (result != NULL) { + out->print(" min " SIZE_FORMAT " desired " SIZE_FORMAT " actual " SIZE_FORMAT " " PTR_FORMAT, + min_word_size, desired_word_size, actual_word_size, p2i(result)); + } else if (min_word_size != 0) { + out->print(" min " SIZE_FORMAT " desired " SIZE_FORMAT, min_word_size, desired_word_size); + } + } + out->cr(); } } -#endif // G1_ALLOC_REGION_TRACING +#endif // PRODUCT G1AllocRegion::G1AllocRegion(const char* name, bool bot_updates) diff --git a/src/share/vm/gc/g1/g1AllocRegion.hpp b/src/share/vm/gc/g1/g1AllocRegion.hpp --- a/src/share/vm/gc/g1/g1AllocRegion.hpp +++ b/src/share/vm/gc/g1/g1AllocRegion.hpp @@ -31,9 +31,6 @@ class G1CollectedHeap; -// 0 -> no tracing, 1 -> basic tracing, 2 -> basic + allocation tracing -#define G1_ALLOC_REGION_TRACING 0 - // A class that holds a region that is active in satisfying allocation // requests, potentially issued in parallel. When the active region is // full it will be retired and replaced with a new one. The @@ -213,19 +210,19 @@ // is returned after it's been retired. virtual HeapRegion* release(); -#if G1_ALLOC_REGION_TRACING +#ifndef PRODUCT void trace(const char* str, size_t min_word_size = 0, size_t desired_word_size = 0, size_t actual_word_size = 0, HeapWord* result = NULL); -#else // G1_ALLOC_REGION_TRACING +#else // PRODUCT void trace(const char* str, size_t min_word_size = 0, size_t desired_word_size = 0, size_t actual_word_size = 0, HeapWord* result = NULL) { } -#endif // G1_ALLOC_REGION_TRACING +#endif // PRODUCT }; class MutatorAllocRegion : public G1AllocRegion { diff --git a/src/share/vm/logging/logPrefix.hpp b/src/share/vm/logging/logPrefix.hpp --- a/src/share/vm/logging/logPrefix.hpp +++ b/src/share/vm/logging/logPrefix.hpp @@ -42,6 +42,7 @@ LOG_PREFIX(GCId::print_prefix, LOG_TAGS(gc)) \ LOG_PREFIX(GCId::print_prefix, LOG_TAGS(gc, age)) \ LOG_PREFIX(GCId::print_prefix, LOG_TAGS(gc, alloc)) \ + LOG_PREFIX(GCId::print_prefix, LOG_TAGS(gc, alloc, region)) \ LOG_PREFIX(GCId::print_prefix, LOG_TAGS(gc, barrier)) \ LOG_PREFIX(GCId::print_prefix, LOG_TAGS(gc, classhisto)) \ LOG_PREFIX(GCId::print_prefix, LOG_TAGS(gc, compaction)) \