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 timestamp() NOT_MANAGEMENT_RETURN_(0L);
 67 
 68   static void* get_jmm_interface(int version);
 69   static void  get_optional_support(jmmOptionalSupport* support);
 70 
 71   static void  record_vm_startup_time(jlong begin, jlong duration)
 72       NOT_MANAGEMENT_RETURN;
 73   static void  record_vm_init_completed() NOT_MANAGEMENT_RETURN;
 74 
 75   static jlong begin_vm_creation_time() NOT_MANAGEMENT_RETURN_(0L);
 76   static jlong vm_init_done_time() NOT_MANAGEMENT_RETURN_(0L);
 77 
 78   // methods to return a Klass*.
 79   static InstanceKlass* java_lang_management_ThreadInfo_klass(TRAPS);
 80   static InstanceKlass* java_lang_management_MemoryUsage_klass(TRAPS)
 81       NOT_MANAGEMENT_RETURN_(nullptr);
 82   static InstanceKlass* java_lang_management_MemoryPoolMXBean_klass(TRAPS);
 83   static InstanceKlass* java_lang_management_MemoryManagerMXBean_klass(TRAPS);
 84   static InstanceKlass* java_lang_management_GarbageCollectorMXBean_klass(TRAPS);
 85   static InstanceKlass* sun_management_ManagementFactoryHelper_klass(TRAPS)
 86       NOT_MANAGEMENT_RETURN_(nullptr);
 87   static InstanceKlass* sun_management_Sensor_klass(TRAPS)
 88       NOT_MANAGEMENT_RETURN_(nullptr);
 89   static InstanceKlass* com_sun_management_internal_GarbageCollectorExtImpl_klass(TRAPS)
 90       NOT_MANAGEMENT_RETURN_(nullptr);
 91   static InstanceKlass* com_sun_management_GcInfo_klass(TRAPS)
 92       NOT_MANAGEMENT_RETURN_(nullptr);
 93   static InstanceKlass* com_sun_management_internal_DiagnosticCommandImpl_klass(TRAPS)
 94       NOT_MANAGEMENT_RETURN_(nullptr);
 95 
 96   static instanceOop create_thread_info_instance(ThreadSnapshot* snapshot, TRAPS);
 97   static instanceOop create_thread_info_instance(ThreadSnapshot* snapshot, objArrayHandle monitors_array, typeArrayHandle depths_array, objArrayHandle synchronizers_array, TRAPS);
 98 };
 99 
100 class TraceVmCreationTime : public StackObj {
101 private:
102   TimeStamp _timer;
103   jlong     _begin_time;
104 
105 public:
106   TraceVmCreationTime() {}
107   ~TraceVmCreationTime() {}
108 
109   void start()
110   { _timer.update_to(0); _begin_time = os::javaTimeMillis(); }
111 
112   jlong begin_time() const {
113     return _begin_time;
114   }
115 
116   /**
117    * Only call this if initialization completes successfully; it will
118    * crash if PerfMemory_exit() has already been called (usually by
119    * os::shutdown() when there was an initialization failure).
120    */
121   void end()
122   { Management::record_vm_startup_time(_begin_time, _timer.milliseconds()); }
123 
124 };
125 
126 #endif // SHARE_SERVICES_MANAGEMENT_HPP