src/share/vm/jfr/leakprofiler/leakProfiler.cpp

Mon, 12 Aug 2019 18:30:40 +0300

author
apetushkov
date
Mon, 12 Aug 2019 18:30:40 +0300
changeset 9858
b985cbb00e68
child 9885
8e875c964f41
permissions
-rw-r--r--

8223147: JFR Backport
8199712: Flight Recorder
8203346: JFR: Inconsistent signature of jfr_add_string_constant
8195817: JFR.stop should require name of recording
8195818: JFR.start should increase autogenerated name by one
8195819: Remove recording=x from jcmd JFR.check output
8203921: JFR thread sampling is missing fixes from JDK-8194552
8203929: Limit amount of data for JFR.dump
8203664: JFR start failure after AppCDS archive created with JFR StartFlightRecording
8003209: JFR events for network utilization
8207392: [PPC64] Implement JFR profiling
8202835: jfr/event/os/TestSystemProcess.java fails on missing events
Summary: Backport JFR from JDK11. Initial integration
Reviewed-by: neugens

     1 /*
     2  * Copyright (c) 2014, 2018, 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  */
    25 #include "precompiled.hpp"
    26 #include "jfr/leakprofiler/emitEventOperation.hpp"
    27 #include "jfr/leakprofiler/leakProfiler.hpp"
    28 #include "jfr/leakprofiler/startOperation.hpp"
    29 #include "jfr/leakprofiler/stopOperation.hpp"
    30 #include "jfr/leakprofiler/sampling/objectSampler.hpp"
    31 #include "jfr/recorder/service/jfrOptionSet.hpp"
    32 #include "memory/iterator.hpp"
    33 #include "oops/oop.hpp"
    34 #include "runtime/atomic.hpp"
    35 #include "runtime/orderAccess.hpp"
    36 #include "runtime/thread.inline.hpp"
    37 #include "runtime/vmThread.hpp"
    38 #include "utilities/ostream.hpp"
    40 // Only to be updated during safepoint
    41 ObjectSampler* LeakProfiler::_object_sampler = NULL;
    43 static volatile jbyte suspended = 0;
    44 bool LeakProfiler::start(jint sample_count) {
    45   if (_object_sampler != NULL) {
    46     // already started
    47     return true;
    48   }
    49   // Allows user to disable leak profiler on command line by setting queue size to zero.
    50   if (sample_count > 0) {
    51     StartOperation op(sample_count);
    52     VMThread::execute(&op);
    53     return _object_sampler != NULL;
    54   }
    55   return false;
    56 }
    58 bool LeakProfiler::stop() {
    59   if (_object_sampler == NULL) {
    60     // already stopped/not started
    61     return true;
    62   }
    63   StopOperation op;
    64   VMThread::execute(&op);
    65   return _object_sampler == NULL;
    66 }
    68 void LeakProfiler::emit_events(jlong cutoff_ticks, bool emit_all) {
    69   if (!is_running()) {
    70     return;
    71   }
    72   EmitEventOperation op(cutoff_ticks, emit_all);
    73   VMThread::execute(&op);
    74 }
    76 void LeakProfiler::oops_do(BoolObjectClosure* is_alive, OopClosure* f) {
    77   assert(SafepointSynchronize::is_at_safepoint(),
    78     "Leak Profiler::oops_do(...) may only be called during safepoint");
    80   if (_object_sampler != NULL) {
    81     _object_sampler->oops_do(is_alive, f);
    82   }
    83 }
    85 void LeakProfiler::sample(HeapWord* object,
    86                           size_t size,
    87                           JavaThread* thread) {
    88   assert(is_running(), "invariant");
    89   assert(thread != NULL, "invariant");
    90   assert(thread->thread_state() == _thread_in_vm, "invariant");
    92   // exclude compiler threads and code sweeper thread
    93   if (thread->is_hidden_from_external_view()) {
    94     return;
    95   }
    97   _object_sampler->add(object, size, thread);
    98 }
   100 ObjectSampler* LeakProfiler::object_sampler() {
   101   assert(is_suspended() || SafepointSynchronize::is_at_safepoint(),
   102     "Leak Profiler::object_sampler() may only be called during safepoint");
   103   return _object_sampler;
   104 }
   106 void LeakProfiler::set_object_sampler(ObjectSampler* object_sampler) {
   107   assert(SafepointSynchronize::is_at_safepoint(),
   108     "Leak Profiler::set_object_sampler() may only be called during safepoint");
   109   _object_sampler = object_sampler;
   110 }
   112 bool LeakProfiler::is_running() {
   113   return _object_sampler != NULL && !suspended;
   114 }
   116 bool LeakProfiler::is_suspended() {
   117   return _object_sampler != NULL && suspended;
   118 }
   120 void LeakProfiler::resume() {
   121   assert(is_suspended(), "invariant");
   122   OrderAccess::storestore();
   123   Atomic::store((jbyte)0, &suspended);
   124   assert(is_running(), "invariant");
   125 }
   127 void LeakProfiler::suspend() {
   128   assert(SafepointSynchronize::is_at_safepoint(), "invariant");
   129   assert(_object_sampler != NULL, "invariant");
   130   assert(!is_suspended(), "invariant");
   131   suspended = (jbyte)1; // safepoint visible
   132 }

mercurial