8198720: Obsolete PrintSafepointStatistics, PrintSafepointStatisticsTimeout and PrintSafepointStatisticsCount options

Convert PrintSafepointStatistics to UL

Reviewed-by: shade, lfoltan
This commit is contained in:
Coleen Phillimore 2018-07-11 14:44:05 -04:00
parent 0a1e54644b
commit fb3b911fbe
8 changed files with 141 additions and 218 deletions

@ -535,9 +535,6 @@ static SpecialFlag const special_jvm_flags[] = {
{ "IgnoreUnverifiableClassesDuringDump", JDK_Version::jdk(10), JDK_Version::undefined(), JDK_Version::undefined() },
{ "CompilerThreadHintNoPreempt", JDK_Version::jdk(11), JDK_Version::jdk(12), JDK_Version::jdk(13) },
{ "VMThreadHintNoPreempt", JDK_Version::jdk(11), JDK_Version::jdk(12), JDK_Version::jdk(13) },
{ "PrintSafepointStatistics", JDK_Version::jdk(11), JDK_Version::jdk(12), JDK_Version::jdk(13) },
{ "PrintSafepointStatisticsTimeout", JDK_Version::jdk(11), JDK_Version::jdk(12), JDK_Version::jdk(13) },
{ "PrintSafepointStatisticsCount",JDK_Version::jdk(11), JDK_Version::jdk(12), JDK_Version::jdk(13) },
{ "AggressiveOpts", JDK_Version::jdk(11), JDK_Version::jdk(12), JDK_Version::jdk(13) },
// --- Deprecated alias flags (see also aliased_jvm_flags) - sorted by obsolete_in then expired_in:
@ -573,6 +570,9 @@ static SpecialFlag const special_jvm_flags[] = {
{ "NativeMonitorFlags", JDK_Version::undefined(), JDK_Version::jdk(11), JDK_Version::jdk(12) },
{ "UnlinkSymbolsALot", JDK_Version::jdk(11), JDK_Version::jdk(12), JDK_Version::jdk(13) },
{ "AllowNonVirtualCalls", JDK_Version::jdk(11), JDK_Version::jdk(12), JDK_Version::jdk(13) },
{ "PrintSafepointStatistics", JDK_Version::jdk(11), JDK_Version::jdk(12), JDK_Version::jdk(13) },
{ "PrintSafepointStatisticsTimeout",JDK_Version::jdk(11), JDK_Version::jdk(12), JDK_Version::jdk(13) },
{ "PrintSafepointStatisticsCount", JDK_Version::jdk(11), JDK_Version::jdk(12), JDK_Version::jdk(13) },
#ifdef TEST_VERIFY_SPECIAL_JVM_FLAGS
{ "dep > obs", JDK_Version::jdk(9), JDK_Version::jdk(8), JDK_Version::undefined() },

@ -1177,20 +1177,6 @@ define_pd_global(uint64_t,MaxRAM, 1ULL*G);
"null (+offset) will not raise a SIGSEGV, i.e.," \
"ImplicitNullChecks don't work (PPC64).") \
\
product(bool, PrintSafepointStatistics, false, \
"(Deprecated) Print statistics about safepoint synchronization") \
\
product(intx, PrintSafepointStatisticsCount, 300, \
"(Deprecated) Total number of safepoint statistics collected " \
"before printing them out") \
range(1, max_intx) \
\
product(intx, PrintSafepointStatisticsTimeout, -1, \
"(Deprecated) Print safepoint statistics only when safepoint takes " \
"more than PrintSafepointSatisticsTimeout in millis") \
LP64_ONLY(range(-1, max_intx/MICROUNITS)) \
NOT_LP64(range(-1, max_intx)) \
\
diagnostic(bool, EnableThreadSMRExtraValidityChecks, true, \
"Enable Thread SMR extra validity checks") \
\

@ -28,6 +28,8 @@
#include "code/icBuffer.hpp"
#include "gc/shared/collectedHeap.hpp"
#include "interpreter/bytecodes.hpp"
#include "logging/log.hpp"
#include "logging/logTag.hpp"
#include "memory/universe.hpp"
#include "prims/methodHandles.hpp"
#include "runtime/flags/jvmFlag.hpp"
@ -165,7 +167,7 @@ void exit_globals() {
if (!destructorsCalled) {
destructorsCalled = true;
perfMemory_exit();
if (PrintSafepointStatistics) {
if (log_is_enabled(Debug, safepoint, stats)) {
// Print the collected safepoint statistics.
SafepointSynchronize::print_stat_on_exit();
}

@ -150,15 +150,23 @@ static volatile int PageArmed = 0 ; // safepoint polling page is RO|RW vs
static volatile int TryingToBlock = 0 ; // proximate value -- for advisory use only
static bool timeout_error_printed = false;
// Statistic related statics
julong SafepointSynchronize::_coalesced_vmop_count = 0;
static jlong _safepoint_begin_time = 0;
static float _ts_of_current_safepoint = 0.0f;
static volatile int _nof_threads_hit_polling_page = 0;
// Roll all threads forward to a safepoint and suspend them all
void SafepointSynchronize::begin() {
EventSafepointBegin begin_event;
Thread* myThread = Thread::current();
assert(myThread->is_VM_thread(), "Only VM thread may execute a safepoint");
if (PrintSafepointStatistics || PrintSafepointStatisticsTimeout > 0) {
if (log_is_enabled(Debug, safepoint, stats)) {
_safepoint_begin_time = os::javaTimeNanos();
_ts_of_current_safepoint = tty->time_stamp().seconds();
_nof_threads_hit_polling_page = 0;
}
Universe::heap()->safepoint_synchronize_begin();
@ -190,14 +198,6 @@ void SafepointSynchronize::begin() {
jlong safepoint_limit_time = 0;
timeout_error_printed = false;
// PrintSafepointStatisticsTimeout can be specified separately. When
// specified, PrintSafepointStatistics will be set to true in
// deferred_initialize_stat method. The initialization has to be done
// early enough to avoid any races. See bug 6880029 for details.
if (PrintSafepointStatistics || PrintSafepointStatisticsTimeout > 0) {
deferred_initialize_stat();
}
// Begin the process of bringing the system to a safepoint.
// Java threads can be in several different states and are
// stopped by different mechanisms:
@ -312,7 +312,7 @@ void SafepointSynchronize::begin() {
if (iterations == 0) {
initial_running = still_running;
if (PrintSafepointStatistics) {
if (log_is_enabled(Debug, safepoint, stats)) {
begin_statistics(nof_threads, still_running);
}
}
@ -403,7 +403,7 @@ void SafepointSynchronize::begin() {
} // ThreadsListHandle destroyed here.
assert(still_running == 0, "sanity check");
if (PrintSafepointStatistics) {
if (log_is_enabled(Debug, safepoint, stats)) {
update_statistics_on_spin_end();
}
if (sync_event.should_commit()) {
@ -436,7 +436,7 @@ void SafepointSynchronize::begin() {
if (SafepointTimeout) {
jlong current_time = os::javaTimeNanos();
if (safepoint_limit_time < current_time) {
tty->print_cr("# SafepointSynchronize: Finished after "
log_warning(safepoint)("# SafepointSynchronize: Finished after "
INT64_FORMAT_W(6) " ms",
(int64_t)((current_time - safepoint_limit_time) / MICROUNITS +
(jlong)SafepointTimeoutDelay));
@ -470,7 +470,7 @@ void SafepointSynchronize::begin() {
log_info(safepoint)("Entering safepoint region: %s", VMThread::vm_safepoint_description());
RuntimeService::record_safepoint_synchronized();
if (PrintSafepointStatistics) {
if (log_is_enabled(Debug, safepoint, stats)) {
update_statistics_on_sync_end(os::javaTimeNanos());
}
@ -483,7 +483,7 @@ void SafepointSynchronize::begin() {
}
}
if (PrintSafepointStatistics) {
if (log_is_enabled(Debug, safepoint, stats)) {
// Record how much time spend on the above cleanup tasks
update_statistics_on_cleanup_end(os::javaTimeNanos());
}
@ -506,7 +506,7 @@ void SafepointSynchronize::end() {
DEBUG_ONLY(Thread* myThread = Thread::current();)
assert(myThread->is_VM_thread(), "Only VM thread can execute a safepoint");
if (PrintSafepointStatistics) {
if (log_is_enabled(Debug, safepoint, stats)) {
end_statistics(os::javaTimeNanos());
}
@ -952,8 +952,8 @@ void SafepointSynchronize::handle_polling_page_exception(JavaThread *thread) {
assert(SafepointSynchronize::is_synchronizing(), "polling encountered outside safepoint synchronization");
}
if (PrintSafepointStatistics) {
inc_page_trap_count();
if (log_is_enabled(Debug, safepoint, stats)) {
Atomic::inc(&_nof_threads_hit_polling_page);
}
ThreadSafepointState* state = thread->safepoint_state();
@ -967,29 +967,34 @@ void SafepointSynchronize::print_safepoint_timeout(SafepointTimeoutReason reason
timeout_error_printed = true;
// Print out the thread info which didn't reach the safepoint for debugging
// purposes (useful when there are lots of threads in the debugger).
tty->cr();
tty->print_cr("# SafepointSynchronize::begin: Timeout detected:");
if (reason == _spinning_timeout) {
tty->print_cr("# SafepointSynchronize::begin: Timed out while spinning to reach a safepoint.");
} else if (reason == _blocking_timeout) {
tty->print_cr("# SafepointSynchronize::begin: Timed out while waiting for threads to stop.");
}
LogTarget(Warning, safepoint) lt;
if (lt.is_enabled()) {
ResourceMark rm;
LogStream ls(lt);
tty->print_cr("# SafepointSynchronize::begin: Threads which did not reach the safepoint:");
ThreadSafepointState *cur_state;
ResourceMark rm;
for (JavaThreadIteratorWithHandle jtiwh; JavaThread *cur_thread = jtiwh.next(); ) {
cur_state = cur_thread->safepoint_state();
if (cur_thread->thread_state() != _thread_blocked &&
((reason == _spinning_timeout && cur_state->is_running()) ||
(reason == _blocking_timeout && !cur_state->has_called_back()))) {
tty->print("# ");
cur_thread->print();
tty->cr();
ls.cr();
ls.print_cr("# SafepointSynchronize::begin: Timeout detected:");
if (reason == _spinning_timeout) {
ls.print_cr("# SafepointSynchronize::begin: Timed out while spinning to reach a safepoint.");
} else if (reason == _blocking_timeout) {
ls.print_cr("# SafepointSynchronize::begin: Timed out while waiting for threads to stop.");
}
ls.print_cr("# SafepointSynchronize::begin: Threads which did not reach the safepoint:");
ThreadSafepointState *cur_state;
for (JavaThreadIteratorWithHandle jtiwh; JavaThread *cur_thread = jtiwh.next(); ) {
cur_state = cur_thread->safepoint_state();
if (cur_thread->thread_state() != _thread_blocked &&
((reason == _spinning_timeout && cur_state->is_running()) ||
(reason == _blocking_timeout && !cur_state->has_called_back()))) {
ls.print("# ");
cur_thread->print_on(&ls);
ls.cr();
}
}
ls.print_cr("# SafepointSynchronize::begin: (End of list)");
}
tty->print_cr("# SafepointSynchronize::begin: (End of list)");
}
// To debug the long safepoint, specify both DieOnSafepointTimeout &
@ -1239,67 +1244,42 @@ void ThreadSafepointState::handle_polling_page_exception() {
//
// Statistics & Instrumentations
//
SafepointSynchronize::SafepointStats* SafepointSynchronize::_safepoint_stats = NULL;
jlong SafepointSynchronize::_safepoint_begin_time = 0;
int SafepointSynchronize::_cur_stat_index = 0;
julong SafepointSynchronize::_safepoint_reasons[VM_Operation::VMOp_Terminating];
julong SafepointSynchronize::_coalesced_vmop_count = 0;
jlong SafepointSynchronize::_max_sync_time = 0;
jlong SafepointSynchronize::_max_vmop_time = 0;
float SafepointSynchronize::_ts_of_current_safepoint = 0.0f;
struct SafepointStats {
float _time_stamp; // record when the current safepoint occurs in seconds
int _vmop_type; // tyep of VM operation triggers the safepoint
int _nof_total_threads; // total number of Java threads
int _nof_initial_running_threads; // total number of initially seen running threads
int _nof_threads_wait_to_block; // total number of threads waiting for to block
bool _page_armed; // true if polling page is armed, false otherwise
int _nof_threads_hit_page_trap; // total number of threads hitting the page trap
jlong _time_to_spin; // total time in millis spent in spinning
jlong _time_to_wait_to_block; // total time in millis spent in waiting for to block
jlong _time_to_do_cleanups; // total time in millis spent in performing cleanups
jlong _time_to_sync; // total time in millis spent in getting to _synchronized
jlong _time_to_exec_vmop; // total time in millis spent in vm operation itself
};
static const int _statistics_header_count = 30;
static int _cur_stat_index = 0;
static SafepointStats safepoint_stats = {0}; // zero initialize
static SafepointStats* spstat = &safepoint_stats;
static julong _safepoint_reasons[VM_Operation::VMOp_Terminating];
static jlong _max_sync_time = 0;
static jlong _max_vmop_time = 0;
static jlong cleanup_end_time = 0;
static bool init_done = false;
// Helper method to print the header.
static void print_header() {
// The number of spaces is significant here, and should match the format
// specifiers in print_statistics().
tty->print(" vmop "
"[ threads: total initially_running wait_to_block ]"
"[ time: spin block sync cleanup vmop ] ");
tty->print_cr("page_trap_count");
}
void SafepointSynchronize::deferred_initialize_stat() {
if (init_done) return;
// If PrintSafepointStatisticsTimeout is specified, the statistics data will
// be printed right away, in which case, _safepoint_stats will regress to
// a single element array. Otherwise, it is a circular ring buffer with default
// size of PrintSafepointStatisticsCount.
int stats_array_size;
if (PrintSafepointStatisticsTimeout > 0) {
stats_array_size = 1;
PrintSafepointStatistics = true;
} else {
stats_array_size = PrintSafepointStatisticsCount;
}
_safepoint_stats = (SafepointStats*)os::malloc(stats_array_size
* sizeof(SafepointStats), mtInternal);
guarantee(_safepoint_stats != NULL,
"not enough memory for safepoint instrumentation data");
init_done = true;
}
void SafepointSynchronize::begin_statistics(int nof_threads, int nof_running) {
assert(init_done, "safepoint statistics array hasn't been initialized");
SafepointStats *spstat = &_safepoint_stats[_cur_stat_index];
spstat->_time_stamp = _ts_of_current_safepoint;
VM_Operation *op = VMThread::vm_operation();
spstat->_vmop_type = (op != NULL ? op->type() : -1);
if (op != NULL) {
_safepoint_reasons[spstat->_vmop_type]++;
}
spstat->_vmop_type = op != NULL ? op->type() : VM_Operation::VMOp_None;
_safepoint_reasons[spstat->_vmop_type]++;
spstat->_nof_total_threads = nof_threads;
spstat->_nof_initial_running_threads = nof_running;
spstat->_nof_threads_hit_page_trap = 0;
// Records the start time of spinning. The real time spent on spinning
// will be adjusted when spin is done. Same trick is applied for time
@ -1312,8 +1292,6 @@ void SafepointSynchronize::begin_statistics(int nof_threads, int nof_running) {
}
void SafepointSynchronize::update_statistics_on_spin_end() {
SafepointStats *spstat = &_safepoint_stats[_cur_stat_index];
jlong cur_time = os::javaTimeNanos();
spstat->_nof_threads_wait_to_block = _waiting_to_block;
@ -1330,7 +1308,6 @@ void SafepointSynchronize::update_statistics_on_spin_end() {
}
void SafepointSynchronize::update_statistics_on_sync_end(jlong end_time) {
SafepointStats *spstat = &_safepoint_stats[_cur_stat_index];
if (spstat->_nof_threads_wait_to_block != 0) {
spstat->_time_to_wait_to_block = end_time -
@ -1349,106 +1326,90 @@ void SafepointSynchronize::update_statistics_on_sync_end(jlong end_time) {
}
void SafepointSynchronize::update_statistics_on_cleanup_end(jlong end_time) {
SafepointStats *spstat = &_safepoint_stats[_cur_stat_index];
// Record how long spent in cleanup tasks.
spstat->_time_to_do_cleanups = end_time - spstat->_time_to_do_cleanups;
cleanup_end_time = end_time;
}
void SafepointSynchronize::end_statistics(jlong vmop_end_time) {
SafepointStats *spstat = &_safepoint_stats[_cur_stat_index];
// Update the vm operation time.
spstat->_time_to_exec_vmop = vmop_end_time - cleanup_end_time;
if (spstat->_time_to_exec_vmop > _max_vmop_time) {
_max_vmop_time = spstat->_time_to_exec_vmop;
}
// Only the sync time longer than the specified
// PrintSafepointStatisticsTimeout will be printed out right away.
// By default, it is -1 meaning all samples will be put into the list.
if ( PrintSafepointStatisticsTimeout > 0) {
if (spstat->_time_to_sync > (jlong)PrintSafepointStatisticsTimeout * MICROUNITS) {
print_statistics();
}
} else {
// The safepoint statistics will be printed out when the _safepoin_stats
// array fills up.
if (_cur_stat_index == PrintSafepointStatisticsCount - 1) {
print_statistics();
_cur_stat_index = 0;
} else {
_cur_stat_index++;
}
}
spstat->_nof_threads_hit_page_trap = _nof_threads_hit_polling_page;
print_statistics();
}
// Helper method to print the header.
static void print_header(outputStream* st) {
// The number of spaces is significant here, and should match the format
// specifiers in print_statistics().
st->print(" vmop "
"[ threads: total initially_running wait_to_block ]"
"[ time: spin block sync cleanup vmop ] ");
st->print_cr("page_trap_count");
}
// This prints a nice table. To get the statistics to not shift due to the logging uptime
// decorator, use the option as: -Xlog:safepoint+stats=debug:[outputfile]:none
void SafepointSynchronize::print_statistics() {
for (int index = 0; index <= _cur_stat_index; index++) {
if (index % 30 == 0) {
print_header();
}
SafepointStats* sstats = &_safepoint_stats[index];
tty->print("%8.3f: ", sstats->_time_stamp);
tty->print("%-30s [ "
INT32_FORMAT_W(8) " " INT32_FORMAT_W(17) " " INT32_FORMAT_W(13) " "
"]",
(sstats->_vmop_type == -1 ? "no vm operation" : VM_Operation::name(sstats->_vmop_type)),
sstats->_nof_total_threads,
sstats->_nof_initial_running_threads,
sstats->_nof_threads_wait_to_block);
// "/ MICROUNITS " is to convert the unit from nanos to millis.
tty->print("[ "
INT64_FORMAT_W(7) " " INT64_FORMAT_W(7) " "
INT64_FORMAT_W(7) " " INT64_FORMAT_W(7) " "
INT64_FORMAT_W(7) " ] ",
(int64_t)(sstats->_time_to_spin / MICROUNITS),
(int64_t)(sstats->_time_to_wait_to_block / MICROUNITS),
(int64_t)(sstats->_time_to_sync / MICROUNITS),
(int64_t)(sstats->_time_to_do_cleanups / MICROUNITS),
(int64_t)(sstats->_time_to_exec_vmop / MICROUNITS));
LogTarget(Debug, safepoint, stats) lt;
assert (lt.is_enabled(), "should only be called when printing statistics is enabled");
LogStream ls(lt);
tty->print_cr(INT32_FORMAT_W(15) " ", sstats->_nof_threads_hit_page_trap);
// Print header every 30 entries
if ((_cur_stat_index % _statistics_header_count) == 0) {
print_header(&ls);
_cur_stat_index = 1; // wrap
} else {
_cur_stat_index++;
}
ls.print("%8.3f: ", spstat->_time_stamp);
ls.print("%-28s [ "
INT32_FORMAT_W(8) " " INT32_FORMAT_W(17) " " INT32_FORMAT_W(13) " "
"]",
VM_Operation::name(spstat->_vmop_type),
spstat->_nof_total_threads,
spstat->_nof_initial_running_threads,
spstat->_nof_threads_wait_to_block);
// "/ MICROUNITS " is to convert the unit from nanos to millis.
ls.print("[ "
INT64_FORMAT_W(7) " " INT64_FORMAT_W(7) " "
INT64_FORMAT_W(7) " " INT64_FORMAT_W(7) " "
INT64_FORMAT_W(7) " ] ",
(int64_t)(spstat->_time_to_spin / MICROUNITS),
(int64_t)(spstat->_time_to_wait_to_block / MICROUNITS),
(int64_t)(spstat->_time_to_sync / MICROUNITS),
(int64_t)(spstat->_time_to_do_cleanups / MICROUNITS),
(int64_t)(spstat->_time_to_exec_vmop / MICROUNITS));
ls.print_cr(INT32_FORMAT_W(15) " ", spstat->_nof_threads_hit_page_trap);
}
// This method will be called when VM exits. It will first call
// print_statistics to print out the rest of the sampling. Then
// it tries to summarize the sampling.
// This method will be called when VM exits. This tries to summarize the sampling.
// Current thread may already be deleted, so don't use ResourceMark.
void SafepointSynchronize::print_stat_on_exit() {
if (_safepoint_stats == NULL) return;
SafepointStats *spstat = &_safepoint_stats[_cur_stat_index];
// During VM exit, end_statistics may not get called and in that
// case, if the sync time is less than PrintSafepointStatisticsTimeout,
// don't print it out.
// Approximate the vm op time.
_safepoint_stats[_cur_stat_index]._time_to_exec_vmop =
os::javaTimeNanos() - cleanup_end_time;
if ( PrintSafepointStatisticsTimeout < 0 ||
spstat->_time_to_sync > (jlong)PrintSafepointStatisticsTimeout * MICROUNITS) {
print_statistics();
}
tty->cr();
// Print out polling page sampling status.
tty->print_cr("Polling page always armed");
for (int index = 0; index < VM_Operation::VMOp_Terminating; index++) {
if (_safepoint_reasons[index] != 0) {
tty->print_cr("%-26s" UINT64_FORMAT_W(10), VM_Operation::name(index),
_safepoint_reasons[index]);
log_debug(safepoint, stats)("%-28s" UINT64_FORMAT_W(10), VM_Operation::name(index),
_safepoint_reasons[index]);
}
}
tty->print_cr(UINT64_FORMAT_W(5) " VM operations coalesced during safepoint",
_coalesced_vmop_count);
tty->print_cr("Maximum sync time " INT64_FORMAT_W(5) " ms",
(int64_t)(_max_sync_time / MICROUNITS));
tty->print_cr("Maximum vm operation time (except for Exit VM operation) "
INT64_FORMAT_W(5) " ms",
(int64_t)(_max_vmop_time / MICROUNITS));
log_debug(safepoint, stats)("VM operations coalesced during safepoint " INT64_FORMAT,
_coalesced_vmop_count);
log_debug(safepoint, stats)("Maximum sync time " INT64_FORMAT" ms",
(int64_t)(_max_sync_time / MICROUNITS));
log_debug(safepoint, stats)("Maximum vm operation time (except for Exit VM operation) "
INT64_FORMAT " ms",
(int64_t)(_max_vmop_time / MICROUNITS));
}

@ -89,20 +89,6 @@ class SafepointSynchronize : AllStatic {
SAFEPOINT_CLEANUP_NUM_TASKS
};
typedef struct {
float _time_stamp; // record when the current safepoint occurs in seconds
int _vmop_type; // type of VM operation triggers the safepoint
int _nof_total_threads; // total number of Java threads
int _nof_initial_running_threads; // total number of initially seen running threads
int _nof_threads_wait_to_block; // total number of threads waiting for to block
int _nof_threads_hit_page_trap; // total number of threads hitting the page trap
jlong _time_to_spin; // total time in millis spent in spinning
jlong _time_to_wait_to_block; // total time in millis spent in waiting for to block
jlong _time_to_do_cleanups; // total time in millis spent in performing cleanups
jlong _time_to_sync; // total time in millis spent in getting to _synchronized
jlong _time_to_exec_vmop; // total time in millis spent in vm operation itself
} SafepointStats;
private:
static volatile SynchronizeState _state; // Threads might read this flag directly, without acquiring the Threads_lock
static volatile int _waiting_to_block; // number of threads we are waiting for to block
@ -118,27 +104,16 @@ class SafepointSynchronize : AllStatic {
public:
static volatile int _safepoint_counter;
private:
static long _end_of_last_safepoint; // Time of last safepoint in milliseconds
static long _end_of_last_safepoint; // Time of last safepoint in milliseconds
static julong _coalesced_vmop_count; // coalesced vmop count
// Statistics
static jlong _safepoint_begin_time; // time when safepoint begins
static SafepointStats* _safepoint_stats; // array of SafepointStats struct
static int _cur_stat_index; // current index to the above array
static julong _safepoint_reasons[]; // safepoint count for each VM op
static julong _coalesced_vmop_count; // coalesced vmop count
static jlong _max_sync_time; // maximum sync time in nanos
static jlong _max_vmop_time; // maximum vm operation time in nanos
static float _ts_of_current_safepoint; // time stamp of current safepoint in seconds
static void begin_statistics(int nof_threads, int nof_running);
static void update_statistics_on_spin_end();
static void update_statistics_on_sync_end(jlong end_time);
static void update_statistics_on_cleanup_end(jlong end_time);
static void end_statistics(jlong end_time);
static void print_statistics();
inline static void inc_page_trap_count() {
Atomic::inc(&_safepoint_stats[_cur_stat_index]._nof_threads_hit_page_trap);
}
// For debug long safepoint
static void print_safepoint_timeout(SafepointTimeoutReason timeout_reason);
@ -192,7 +167,6 @@ public:
static bool is_cleanup_needed();
static void do_cleanup_tasks();
static void deferred_initialize_stat();
static void print_stat_on_exit();
inline static void inc_vmop_coalesced_count() { _coalesced_vmop_count++; }

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998, 2017, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1998, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -47,8 +47,8 @@
#include "utilities/xmlstream.hpp"
// Dummy VM operation to act as first element in our circular double-linked list
class VM_Dummy: public VM_Operation {
VMOp_Type type() const { return VMOp_Dummy; }
class VM_None: public VM_Operation {
VMOp_Type type() const { return VMOp_None; }
void doit() {};
};
@ -58,7 +58,7 @@ VMOperationQueue::VMOperationQueue() {
for(int i = 0; i < nof_priorities; i++) {
_queue_length[i] = 0;
_queue_counter = 0;
_queue[i] = new VM_Dummy();
_queue[i] = new VM_None();
_queue[i]->set_next(_queue[i]);
_queue[i]->set_prev(_queue[i]);
}
@ -511,7 +511,7 @@ void VMThread::loop() {
_vm_queue->set_drain_list(next);
evaluate_operation(_cur_vm_operation);
_cur_vm_operation = next;
if (PrintSafepointStatistics) {
if (log_is_enabled(Debug, safepoint, stats)) {
SafepointSynchronize::inc_vmop_coalesced_count();
}
} while (_cur_vm_operation != NULL);

@ -40,7 +40,7 @@
// Note: When new VM_XXX comes up, add 'XXX' to the template table.
#define VM_OPS_DO(template) \
template(Dummy) \
template(None) \
template(ThreadStop) \
template(ThreadDump) \
template(PrintThreads) \

@ -35,7 +35,7 @@ class VM_StopSafepoint : public VM_Operation {
public:
Semaphore* _test_complete;
VM_StopSafepoint(Semaphore* wait_for) : _test_complete(wait_for) {}
VMOp_Type type() const { return VMOp_Dummy; }
VMOp_Type type() const { return VMOp_None; }
Mode evaluation_mode() const { return _no_safepoint; }
bool is_cheap_allocated() const { return false; }
void doit() { _test_complete->wait(); }