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