27 #include "compiler/compileBroker.hpp" |
27 #include "compiler/compileBroker.hpp" |
28 #include "memory/iterator.hpp" |
28 #include "memory/iterator.hpp" |
29 #include "memory/oopFactory.hpp" |
29 #include "memory/oopFactory.hpp" |
30 #include "memory/resourceArea.hpp" |
30 #include "memory/resourceArea.hpp" |
31 #include "oops/klass.hpp" |
31 #include "oops/klass.hpp" |
32 #include "oops/klassOop.hpp" |
|
33 #include "oops/objArrayKlass.hpp" |
32 #include "oops/objArrayKlass.hpp" |
34 #include "oops/oop.inline.hpp" |
33 #include "oops/oop.inline.hpp" |
35 #include "runtime/arguments.hpp" |
34 #include "runtime/arguments.hpp" |
36 #include "runtime/globals.hpp" |
35 #include "runtime/globals.hpp" |
37 #include "runtime/handles.inline.hpp" |
36 #include "runtime/handles.inline.hpp" |
57 |
56 |
58 PerfVariable* Management::_begin_vm_creation_time = NULL; |
57 PerfVariable* Management::_begin_vm_creation_time = NULL; |
59 PerfVariable* Management::_end_vm_creation_time = NULL; |
58 PerfVariable* Management::_end_vm_creation_time = NULL; |
60 PerfVariable* Management::_vm_init_done_time = NULL; |
59 PerfVariable* Management::_vm_init_done_time = NULL; |
61 |
60 |
62 klassOop Management::_sensor_klass = NULL; |
61 Klass* Management::_sensor_klass = NULL; |
63 klassOop Management::_threadInfo_klass = NULL; |
62 Klass* Management::_threadInfo_klass = NULL; |
64 klassOop Management::_memoryUsage_klass = NULL; |
63 Klass* Management::_memoryUsage_klass = NULL; |
65 klassOop Management::_memoryPoolMXBean_klass = NULL; |
64 Klass* Management::_memoryPoolMXBean_klass = NULL; |
66 klassOop Management::_memoryManagerMXBean_klass = NULL; |
65 Klass* Management::_memoryManagerMXBean_klass = NULL; |
67 klassOop Management::_garbageCollectorMXBean_klass = NULL; |
66 Klass* Management::_garbageCollectorMXBean_klass = NULL; |
68 klassOop Management::_managementFactory_klass = NULL; |
67 Klass* Management::_managementFactory_klass = NULL; |
69 klassOop Management::_garbageCollectorImpl_klass = NULL; |
68 Klass* Management::_garbageCollectorImpl_klass = NULL; |
70 klassOop Management::_gcInfo_klass = NULL; |
69 Klass* Management::_gcInfo_klass = NULL; |
71 |
70 |
72 jmmOptionalSupport Management::_optional_support = {0}; |
71 jmmOptionalSupport Management::_optional_support = {0}; |
73 TimeStamp Management::_stamp; |
72 TimeStamp Management::_stamp; |
74 |
73 |
75 void management_init() { |
74 void management_init() { |
154 |
153 |
155 void Management::get_optional_support(jmmOptionalSupport* support) { |
154 void Management::get_optional_support(jmmOptionalSupport* support) { |
156 memcpy(support, &_optional_support, sizeof(jmmOptionalSupport)); |
155 memcpy(support, &_optional_support, sizeof(jmmOptionalSupport)); |
157 } |
156 } |
158 |
157 |
159 klassOop Management::load_and_initialize_klass(Symbol* sh, TRAPS) { |
158 Klass* Management::load_and_initialize_klass(Symbol* sh, TRAPS) { |
160 klassOop k = SystemDictionary::resolve_or_fail(sh, true, CHECK_NULL); |
159 Klass* k = SystemDictionary::resolve_or_fail(sh, true, CHECK_NULL); |
161 instanceKlassHandle ik (THREAD, k); |
160 instanceKlassHandle ik (THREAD, k); |
162 if (ik->should_be_initialized()) { |
161 if (ik->should_be_initialized()) { |
163 ik->initialize(CHECK_NULL); |
162 ik->initialize(CHECK_NULL); |
164 } |
163 } |
|
164 // If these classes change to not be owned by the boot loader, they need |
|
165 // to be walked to keep their class loader alive in oops_do. |
|
166 assert(ik->class_loader() == NULL, "need to follow in oops_do"); |
165 return ik(); |
167 return ik(); |
166 } |
168 } |
167 |
169 |
168 void Management::record_vm_startup_time(jlong begin, jlong duration) { |
170 void Management::record_vm_startup_time(jlong begin, jlong duration) { |
169 // if the performance counter is not initialized, |
171 // if the performance counter is not initialized, |
182 } |
184 } |
183 |
185 |
184 void Management::oops_do(OopClosure* f) { |
186 void Management::oops_do(OopClosure* f) { |
185 MemoryService::oops_do(f); |
187 MemoryService::oops_do(f); |
186 ThreadService::oops_do(f); |
188 ThreadService::oops_do(f); |
187 |
189 } |
188 f->do_oop((oop*) &_sensor_klass); |
190 |
189 f->do_oop((oop*) &_threadInfo_klass); |
191 Klass* Management::java_lang_management_ThreadInfo_klass(TRAPS) { |
190 f->do_oop((oop*) &_memoryUsage_klass); |
|
191 f->do_oop((oop*) &_memoryPoolMXBean_klass); |
|
192 f->do_oop((oop*) &_memoryManagerMXBean_klass); |
|
193 f->do_oop((oop*) &_garbageCollectorMXBean_klass); |
|
194 f->do_oop((oop*) &_managementFactory_klass); |
|
195 f->do_oop((oop*) &_garbageCollectorImpl_klass); |
|
196 f->do_oop((oop*) &_gcInfo_klass); |
|
197 } |
|
198 |
|
199 klassOop Management::java_lang_management_ThreadInfo_klass(TRAPS) { |
|
200 if (_threadInfo_klass == NULL) { |
192 if (_threadInfo_klass == NULL) { |
201 _threadInfo_klass = load_and_initialize_klass(vmSymbols::java_lang_management_ThreadInfo(), CHECK_NULL); |
193 _threadInfo_klass = load_and_initialize_klass(vmSymbols::java_lang_management_ThreadInfo(), CHECK_NULL); |
202 } |
194 } |
203 return _threadInfo_klass; |
195 return _threadInfo_klass; |
204 } |
196 } |
205 |
197 |
206 klassOop Management::java_lang_management_MemoryUsage_klass(TRAPS) { |
198 Klass* Management::java_lang_management_MemoryUsage_klass(TRAPS) { |
207 if (_memoryUsage_klass == NULL) { |
199 if (_memoryUsage_klass == NULL) { |
208 _memoryUsage_klass = load_and_initialize_klass(vmSymbols::java_lang_management_MemoryUsage(), CHECK_NULL); |
200 _memoryUsage_klass = load_and_initialize_klass(vmSymbols::java_lang_management_MemoryUsage(), CHECK_NULL); |
209 } |
201 } |
210 return _memoryUsage_klass; |
202 return _memoryUsage_klass; |
211 } |
203 } |
212 |
204 |
213 klassOop Management::java_lang_management_MemoryPoolMXBean_klass(TRAPS) { |
205 Klass* Management::java_lang_management_MemoryPoolMXBean_klass(TRAPS) { |
214 if (_memoryPoolMXBean_klass == NULL) { |
206 if (_memoryPoolMXBean_klass == NULL) { |
215 _memoryPoolMXBean_klass = load_and_initialize_klass(vmSymbols::java_lang_management_MemoryPoolMXBean(), CHECK_NULL); |
207 _memoryPoolMXBean_klass = load_and_initialize_klass(vmSymbols::java_lang_management_MemoryPoolMXBean(), CHECK_NULL); |
216 } |
208 } |
217 return _memoryPoolMXBean_klass; |
209 return _memoryPoolMXBean_klass; |
218 } |
210 } |
219 |
211 |
220 klassOop Management::java_lang_management_MemoryManagerMXBean_klass(TRAPS) { |
212 Klass* Management::java_lang_management_MemoryManagerMXBean_klass(TRAPS) { |
221 if (_memoryManagerMXBean_klass == NULL) { |
213 if (_memoryManagerMXBean_klass == NULL) { |
222 _memoryManagerMXBean_klass = load_and_initialize_klass(vmSymbols::java_lang_management_MemoryManagerMXBean(), CHECK_NULL); |
214 _memoryManagerMXBean_klass = load_and_initialize_klass(vmSymbols::java_lang_management_MemoryManagerMXBean(), CHECK_NULL); |
223 } |
215 } |
224 return _memoryManagerMXBean_klass; |
216 return _memoryManagerMXBean_klass; |
225 } |
217 } |
226 |
218 |
227 klassOop Management::java_lang_management_GarbageCollectorMXBean_klass(TRAPS) { |
219 Klass* Management::java_lang_management_GarbageCollectorMXBean_klass(TRAPS) { |
228 if (_garbageCollectorMXBean_klass == NULL) { |
220 if (_garbageCollectorMXBean_klass == NULL) { |
229 _garbageCollectorMXBean_klass = load_and_initialize_klass(vmSymbols::java_lang_management_GarbageCollectorMXBean(), CHECK_NULL); |
221 _garbageCollectorMXBean_klass = load_and_initialize_klass(vmSymbols::java_lang_management_GarbageCollectorMXBean(), CHECK_NULL); |
230 } |
222 } |
231 return _garbageCollectorMXBean_klass; |
223 return _garbageCollectorMXBean_klass; |
232 } |
224 } |
233 |
225 |
234 klassOop Management::sun_management_Sensor_klass(TRAPS) { |
226 Klass* Management::sun_management_Sensor_klass(TRAPS) { |
235 if (_sensor_klass == NULL) { |
227 if (_sensor_klass == NULL) { |
236 _sensor_klass = load_and_initialize_klass(vmSymbols::sun_management_Sensor(), CHECK_NULL); |
228 _sensor_klass = load_and_initialize_klass(vmSymbols::sun_management_Sensor(), CHECK_NULL); |
237 } |
229 } |
238 return _sensor_klass; |
230 return _sensor_klass; |
239 } |
231 } |
240 |
232 |
241 klassOop Management::sun_management_ManagementFactory_klass(TRAPS) { |
233 Klass* Management::sun_management_ManagementFactory_klass(TRAPS) { |
242 if (_managementFactory_klass == NULL) { |
234 if (_managementFactory_klass == NULL) { |
243 _managementFactory_klass = load_and_initialize_klass(vmSymbols::sun_management_ManagementFactory(), CHECK_NULL); |
235 _managementFactory_klass = load_and_initialize_klass(vmSymbols::sun_management_ManagementFactory(), CHECK_NULL); |
244 } |
236 } |
245 return _managementFactory_klass; |
237 return _managementFactory_klass; |
246 } |
238 } |
247 |
239 |
248 klassOop Management::sun_management_GarbageCollectorImpl_klass(TRAPS) { |
240 Klass* Management::sun_management_GarbageCollectorImpl_klass(TRAPS) { |
249 if (_garbageCollectorImpl_klass == NULL) { |
241 if (_garbageCollectorImpl_klass == NULL) { |
250 _garbageCollectorImpl_klass = load_and_initialize_klass(vmSymbols::sun_management_GarbageCollectorImpl(), CHECK_NULL); |
242 _garbageCollectorImpl_klass = load_and_initialize_klass(vmSymbols::sun_management_GarbageCollectorImpl(), CHECK_NULL); |
251 } |
243 } |
252 return _garbageCollectorImpl_klass; |
244 return _garbageCollectorImpl_klass; |
253 } |
245 } |
254 |
246 |
255 klassOop Management::com_sun_management_GcInfo_klass(TRAPS) { |
247 Klass* Management::com_sun_management_GcInfo_klass(TRAPS) { |
256 if (_gcInfo_klass == NULL) { |
248 if (_gcInfo_klass == NULL) { |
257 _gcInfo_klass = load_and_initialize_klass(vmSymbols::com_sun_management_GcInfo(), CHECK_NULL); |
249 _gcInfo_klass = load_and_initialize_klass(vmSymbols::com_sun_management_GcInfo(), CHECK_NULL); |
258 } |
250 } |
259 return _gcInfo_klass; |
251 return _gcInfo_klass; |
260 } |
252 } |
694 JVM_ENTRY(void, jmm_SetPoolSensor(JNIEnv* env, jobject obj, jmmThresholdType type, jobject sensorObj)) |
686 JVM_ENTRY(void, jmm_SetPoolSensor(JNIEnv* env, jobject obj, jmmThresholdType type, jobject sensorObj)) |
695 if (obj == NULL || sensorObj == NULL) { |
687 if (obj == NULL || sensorObj == NULL) { |
696 THROW(vmSymbols::java_lang_NullPointerException()); |
688 THROW(vmSymbols::java_lang_NullPointerException()); |
697 } |
689 } |
698 |
690 |
699 klassOop sensor_klass = Management::sun_management_Sensor_klass(CHECK); |
691 Klass* sensor_klass = Management::sun_management_Sensor_klass(CHECK); |
700 oop s = JNIHandles::resolve(sensorObj); |
692 oop s = JNIHandles::resolve(sensorObj); |
701 assert(s->is_instance(), "Sensor should be an instanceOop"); |
693 assert(s->is_instance(), "Sensor should be an instanceOop"); |
702 instanceHandle sensor_h(THREAD, (instanceOop) s); |
694 instanceHandle sensor_h(THREAD, (instanceOop) s); |
703 if (!sensor_h->is_a(sensor_klass)) { |
695 if (!sensor_h->is_a(sensor_klass)) { |
704 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), |
696 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), |
1721 if (names != NULL) { |
1713 if (names != NULL) { |
1722 // return the requested globals |
1714 // return the requested globals |
1723 objArrayOop ta = objArrayOop(JNIHandles::resolve_non_null(names)); |
1715 objArrayOop ta = objArrayOop(JNIHandles::resolve_non_null(names)); |
1724 objArrayHandle names_ah(THREAD, ta); |
1716 objArrayHandle names_ah(THREAD, ta); |
1725 // Make sure we have a String array |
1717 // Make sure we have a String array |
1726 klassOop element_klass = objArrayKlass::cast(names_ah->klass())->element_klass(); |
1718 Klass* element_klass = objArrayKlass::cast(names_ah->klass())->element_klass(); |
1727 if (element_klass != SystemDictionary::String_klass()) { |
1719 if (element_klass != SystemDictionary::String_klass()) { |
1728 THROW_MSG_(vmSymbols::java_lang_IllegalArgumentException(), |
1720 THROW_MSG_(vmSymbols::java_lang_IllegalArgumentException(), |
1729 "Array element type is not String class", 0); |
1721 "Array element type is not String class", 0); |
1730 } |
1722 } |
1731 |
1723 |
1991 THROW_MSG_(vmSymbols::java_lang_IllegalArgumentException(), |
1983 THROW_MSG_(vmSymbols::java_lang_IllegalArgumentException(), |
1992 "The length of the given MemoryUsage array does not match the number of memory pools.", 0); |
1984 "The length of the given MemoryUsage array does not match the number of memory pools.", 0); |
1993 } |
1985 } |
1994 |
1986 |
1995 // check if the element of array is of type MemoryUsage class |
1987 // check if the element of array is of type MemoryUsage class |
1996 klassOop usage_klass = Management::java_lang_management_MemoryUsage_klass(CHECK_0); |
1988 Klass* usage_klass = Management::java_lang_management_MemoryUsage_klass(CHECK_0); |
1997 klassOop element_klass = objArrayKlass::cast(array_h->klass())->element_klass(); |
1989 Klass* element_klass = objArrayKlass::cast(array_h->klass())->element_klass(); |
1998 if (element_klass != usage_klass) { |
1990 if (element_klass != usage_klass) { |
1999 THROW_MSG_(vmSymbols::java_lang_IllegalArgumentException(), |
1991 THROW_MSG_(vmSymbols::java_lang_IllegalArgumentException(), |
2000 "The element type is not MemoryUsage class", 0); |
1992 "The element type is not MemoryUsage class", 0); |
2001 } |
1993 } |
2002 |
1994 |