1 /*
  2  * Copyright (c) 2003, 2023, 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  */
 24 
 25 #ifndef SHARE_SERVICES_MANAGEMENT_HPP
 26 #define SHARE_SERVICES_MANAGEMENT_HPP
 27 
 28 #include "jmm.h"
 29 #include "memory/allocation.hpp"
 30 #include "runtime/handles.hpp"
 31 #include "runtime/os.hpp"
 32 #include "runtime/perfData.hpp"
 33 #include "runtime/timer.hpp"
 34 
 35 class OopClosure;
 36 class ThreadSnapshot;
 37 
 38 class Management : public AllStatic {
 39 private:
 40   static PerfVariable*      _begin_vm_creation_time;
 41   static PerfVariable*      _end_vm_creation_time;
 42   static PerfVariable*      _vm_init_done_time;
 43   static jmmOptionalSupport _optional_support;
 44   static TimeStamp          _stamp; // Timestamp since vm init done time
 45 
 46   // Management klasses
 47   static InstanceKlass*     _diagnosticCommandImpl_klass;
 48   static InstanceKlass*     _garbageCollectorExtImpl_klass;
 49   static InstanceKlass*     _garbageCollectorMXBean_klass;
 50   static InstanceKlass*     _gcInfo_klass;
 51   static InstanceKlass*     _managementFactoryHelper_klass;
 52   static InstanceKlass*     _memoryManagerMXBean_klass;
 53   static InstanceKlass*     _memoryPoolMXBean_klass;
 54   static InstanceKlass*     _memoryUsage_klass;
 55   static InstanceKlass*     _sensor_klass;
 56   static InstanceKlass*     _threadInfo_klass;
 57   static InstanceKlass* load_and_initialize_klass(Symbol* sh, TRAPS);
 58   static InstanceKlass* load_and_initialize_klass_or_null(Symbol* sh, TRAPS);
 59   static InstanceKlass* initialize_klass(Klass* k, TRAPS);
 60 
 61 public:
 62   static void init();
 63   static void initialize(TRAPS);
 64 
 65   static jlong ticks_to_ms(jlong ticks) NOT_MANAGEMENT_RETURN_(0L);
 66   static jlong ticks_to_us(jlong ticks) NOT_MANAGEMENT_RETURN_(0L);
 67   static jlong timestamp() NOT_MANAGEMENT_RETURN_(0L);
 68 
 69   static void* get_jmm_interface(int version);
 70   static void  get_optional_support(jmmOptionalSupport* support);
 71 
 72   static void  record_vm_startup_time(jlong begin, jlong duration)
 73       NOT_MANAGEMENT_RETURN;
 74   static void  record_vm_init_completed() NOT_MANAGEMENT_RETURN;
 75 
 76   static jlong begin_vm_creation_time() NOT_MANAGEMENT_RETURN_(0L);
 77   static jlong vm_init_done_time() NOT_MANAGEMENT_RETURN_(0L);
 78 
 79   // methods to return a Klass*.
 80   static InstanceKlass* java_lang_management_ThreadInfo_klass(TRAPS);
 81   static InstanceKlass* java_lang_management_MemoryUsage_klass(TRAPS)
 82       NOT_MANAGEMENT_RETURN_(nullptr);
 83   static InstanceKlass* java_lang_management_MemoryPoolMXBean_klass(TRAPS);
 84   static InstanceKlass* java_lang_management_MemoryManagerMXBean_klass(TRAPS);
 85   static InstanceKlass* java_lang_management_GarbageCollectorMXBean_klass(TRAPS);
 86   static InstanceKlass* sun_management_ManagementFactoryHelper_klass(TRAPS)
 87       NOT_MANAGEMENT_RETURN_(nullptr);
 88   static InstanceKlass* sun_management_Sensor_klass(TRAPS)
 89       NOT_MANAGEMENT_RETURN_(nullptr);
 90   static InstanceKlass* com_sun_management_internal_GarbageCollectorExtImpl_klass(TRAPS)
 91       NOT_MANAGEMENT_RETURN_(nullptr);
 92   static InstanceKlass* com_sun_management_GcInfo_klass(TRAPS)
 93       NOT_MANAGEMENT_RETURN_(nullptr);
 94   static InstanceKlass* com_sun_management_internal_DiagnosticCommandImpl_klass(TRAPS)
 95       NOT_MANAGEMENT_RETURN_(nullptr);
 96 
 97   static instanceOop create_thread_info_instance(ThreadSnapshot* snapshot, TRAPS);
 98   static instanceOop create_thread_info_instance(ThreadSnapshot* snapshot, objArrayHandle monitors_array, typeArrayHandle depths_array, objArrayHandle synchronizers_array, TRAPS);
 99 };
100 
101 class TraceVmCreationTime : public StackObj {
102 private:
103   TimeStamp _timer;
104   jlong     _begin_time;
105 
106 public:
107   TraceVmCreationTime() {}
108   ~TraceVmCreationTime() {}
109 
110   void start()
111   { _timer.update_to(0); _begin_time = os::javaTimeMillis(); }
112 
113   jlong begin_time() const {
114     return _begin_time;
115   }
116 
117   /**
118    * Only call this if initialization completes successfully; it will
119    * crash if PerfMemory_exit() has already been called (usually by
120    * os::shutdown() when there was an initialization failure).
121    */
122   void end()
123   { Management::record_vm_startup_time(_begin_time, _timer.milliseconds()); }
124 
125 };
126 
127 #endif // SHARE_SERVICES_MANAGEMENT_HPP