management.hpp revision 1879:f95d63e2154a
1/*
2 * Copyright (c) 2003, 2010, 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_VM_SERVICES_MANAGEMENT_HPP
26#define SHARE_VM_SERVICES_MANAGEMENT_HPP
27
28#include "memory/allocation.hpp"
29#include "runtime/handles.hpp"
30#include "runtime/timer.hpp"
31#include "services/jmm.h"
32
33class OopClosure;
34class ThreadSnapshot;
35
36class Management : public AllStatic {
37private:
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 klassOop           _sensor_klass;
46  static klassOop           _threadInfo_klass;
47  static klassOop           _memoryUsage_klass;
48  static klassOop           _memoryPoolMXBean_klass;
49  static klassOop           _memoryManagerMXBean_klass;
50  static klassOop           _garbageCollectorMXBean_klass;
51  static klassOop           _managementFactory_klass;
52
53  static klassOop load_and_initialize_klass(symbolHandle sh, TRAPS);
54
55public:
56  static void init();
57  static void initialize(TRAPS);
58
59  static jlong ticks_to_ms(jlong ticks);
60  static jlong timestamp();
61
62  static void  oops_do(OopClosure* f);
63  static void* get_jmm_interface(int version);
64  static void  get_optional_support(jmmOptionalSupport* support);
65
66  static void get_loaded_classes(JavaThread* cur_thread, GrowableArray<KlassHandle>* klass_handle_array);
67
68  static void  record_vm_startup_time(jlong begin, jlong duration);
69  static void  record_vm_init_completed() {
70    // Initialize the timestamp to get the current time
71    _vm_init_done_time->set_value(os::javaTimeMillis());
72
73    // Update the timestamp to the vm init done time
74    _stamp.update();
75  }
76
77  static jlong vm_init_done_time() {
78    return _vm_init_done_time->get_value();
79  }
80
81  // methods to return a klassOop.
82  static klassOop java_lang_management_ThreadInfo_klass(TRAPS);
83  static klassOop java_lang_management_MemoryUsage_klass(TRAPS);
84  static klassOop java_lang_management_MemoryPoolMXBean_klass(TRAPS);
85  static klassOop java_lang_management_MemoryManagerMXBean_klass(TRAPS);
86  static klassOop java_lang_management_GarbageCollectorMXBean_klass(TRAPS);
87  static klassOop sun_management_Sensor_klass(TRAPS);
88  static klassOop sun_management_ManagementFactory_klass(TRAPS);
89
90  static instanceOop create_thread_info_instance(ThreadSnapshot* snapshot, TRAPS);
91  static instanceOop create_thread_info_instance(ThreadSnapshot* snapshot, objArrayHandle monitors_array, typeArrayHandle depths_array, objArrayHandle synchronizers_array, TRAPS);
92};
93
94class TraceVmCreationTime : public StackObj {
95private:
96  TimeStamp _timer;
97  jlong     _begin_time;
98
99public:
100  TraceVmCreationTime() {}
101  ~TraceVmCreationTime() {}
102
103  void start()
104  { _timer.update_to(0); _begin_time = os::javaTimeMillis(); }
105
106  /**
107   * Only call this if initialization completes successfully; it will
108   * crash if PerfMemory_exit() has already been called (usually by
109   * os::shutdown() when there was an initialization failure).
110   */
111  void end()
112  { Management::record_vm_startup_time(_begin_time, _timer.milliseconds()); }
113
114};
115
116#endif // SHARE_VM_SERVICES_MANAGEMENT_HPP
117