| 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; | 
|---|
| 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 |  | 
|---|
| 82 | static jlong begin_vm_creation_time() { | 
|---|
| 83 | return _begin_vm_creation_time->get_value(); | 
|---|
| 84 | } | 
|---|
| 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: | 
|---|
| 117 | TraceVmCreationTime() {} | 
|---|
| 118 | ~TraceVmCreationTime() {} | 
|---|
| 119 |  | 
|---|
| 120 | void start() | 
|---|
| 121 | { _timer.update_to(0); _begin_time = os::javaTimeMillis(); } | 
|---|
| 122 |  | 
|---|
| 123 | 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 | */ | 
|---|
| 132 | void end() | 
|---|
| 133 | { Management::record_vm_startup_time(_begin_time, _timer.milliseconds()); } | 
|---|
| 134 |  | 
|---|
| 135 | }; | 
|---|
| 136 |  | 
|---|
| 137 | #endif // SHARE_SERVICES_MANAGEMENT_HPP | 
|---|
| 138 |  | 
|---|