comparison src/share/vm/services/management.cpp @ 6725:da91efe96a93

6964458: Reimplement class meta-data storage to use native memory Summary: Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland Contributed-by: jmasa <jon.masamitsu@oracle.com>, stefank <stefan.karlsson@oracle.com>, mgerdin <mikael.gerdin@oracle.com>, never <tom.rodriguez@oracle.com>
author coleenp
date Sat, 01 Sep 2012 13:25:18 -0400
parents d2a62e0f25eb
children 6af8f3562069
comparison
equal deleted inserted replaced
6724:36d1d483d5d6 6725:da91efe96a93
1 /* 1 /*
2 * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. 2 * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 * 4 *
5 * This code is free software; you can redistribute it and/or modify it 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 6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. 7 * published by the Free Software Foundation.
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() {
134 HandleMark hm(THREAD); 133 HandleMark hm(THREAD);
135 134
136 // Load and initialize the sun.management.Agent class 135 // Load and initialize the sun.management.Agent class
137 // invoke startAgent method to start the management server 136 // invoke startAgent method to start the management server
138 Handle loader = Handle(THREAD, SystemDictionary::java_system_loader()); 137 Handle loader = Handle(THREAD, SystemDictionary::java_system_loader());
139 klassOop k = SystemDictionary::resolve_or_fail(vmSymbols::sun_management_Agent(), 138 Klass* k = SystemDictionary::resolve_or_fail(vmSymbols::sun_management_Agent(),
140 loader, 139 loader,
141 Handle(), 140 Handle(),
142 true, 141 true,
143 CHECK); 142 CHECK);
144 instanceKlassHandle ik (THREAD, k); 143 instanceKlassHandle ik (THREAD, k);
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 }
301 args->push_oop(stacktrace_h); 293 args->push_oop(stacktrace_h);
302 } 294 }
303 295
304 // Helper function to construct a ThreadInfo object 296 // Helper function to construct a ThreadInfo object
305 instanceOop Management::create_thread_info_instance(ThreadSnapshot* snapshot, TRAPS) { 297 instanceOop Management::create_thread_info_instance(ThreadSnapshot* snapshot, TRAPS) {
306 klassOop k = Management::java_lang_management_ThreadInfo_klass(CHECK_NULL); 298 Klass* k = Management::java_lang_management_ThreadInfo_klass(CHECK_NULL);
307 instanceKlassHandle ik (THREAD, k); 299 instanceKlassHandle ik (THREAD, k);
308 300
309 JavaValue result(T_VOID); 301 JavaValue result(T_VOID);
310 JavaCallArguments args(14); 302 JavaCallArguments args(14);
311 303
331 instanceOop Management::create_thread_info_instance(ThreadSnapshot* snapshot, 323 instanceOop Management::create_thread_info_instance(ThreadSnapshot* snapshot,
332 objArrayHandle monitors_array, 324 objArrayHandle monitors_array,
333 typeArrayHandle depths_array, 325 typeArrayHandle depths_array,
334 objArrayHandle synchronizers_array, 326 objArrayHandle synchronizers_array,
335 TRAPS) { 327 TRAPS) {
336 klassOop k = Management::java_lang_management_ThreadInfo_klass(CHECK_NULL); 328 Klass* k = Management::java_lang_management_ThreadInfo_klass(CHECK_NULL);
337 instanceKlassHandle ik (THREAD, k); 329 instanceKlassHandle ik (THREAD, k);
338 330
339 JavaValue result(T_VOID); 331 JavaValue result(T_VOID);
340 JavaCallArguments args(17); 332 JavaCallArguments args(17);
341 333
386 THROW_(vmSymbols::java_lang_NullPointerException(), NULL); 378 THROW_(vmSymbols::java_lang_NullPointerException(), NULL);
387 } 379 }
388 oop mgr_obj = JNIHandles::resolve(mgr); 380 oop mgr_obj = JNIHandles::resolve(mgr);
389 instanceHandle h(THREAD, (instanceOop) mgr_obj); 381 instanceHandle h(THREAD, (instanceOop) mgr_obj);
390 382
391 klassOop k = Management::java_lang_management_GarbageCollectorMXBean_klass(CHECK_NULL); 383 Klass* k = Management::java_lang_management_GarbageCollectorMXBean_klass(CHECK_NULL);
392 if (!h->is_a(k)) { 384 if (!h->is_a(k)) {
393 THROW_MSG_(vmSymbols::java_lang_IllegalArgumentException(), 385 THROW_MSG_(vmSymbols::java_lang_IllegalArgumentException(),
394 "the object is not an instance of java.lang.management.GarbageCollectorMXBean class", 386 "the object is not an instance of java.lang.management.GarbageCollectorMXBean class",
395 NULL); 387 NULL);
396 } 388 }
431 } 423 }
432 } 424 }
433 425
434 static void validate_thread_info_array(objArrayHandle infoArray_h, TRAPS) { 426 static void validate_thread_info_array(objArrayHandle infoArray_h, TRAPS) {
435 // check if the element of infoArray is of type ThreadInfo class 427 // check if the element of infoArray is of type ThreadInfo class
436 klassOop threadinfo_klass = Management::java_lang_management_ThreadInfo_klass(CHECK); 428 Klass* threadinfo_klass = Management::java_lang_management_ThreadInfo_klass(CHECK);
437 klassOop element_klass = objArrayKlass::cast(infoArray_h->klass())->element_klass(); 429 Klass* element_klass = objArrayKlass::cast(infoArray_h->klass())->element_klass();
438 if (element_klass != threadinfo_klass) { 430 if (element_klass != threadinfo_klass) {
439 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), 431 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
440 "infoArray element type is not ThreadInfo class"); 432 "infoArray element type is not ThreadInfo class");
441 } 433 }
442 } 434 }
572 } 564 }
573 num_memory_pools = mgr->num_memory_pools(); 565 num_memory_pools = mgr->num_memory_pools();
574 } 566 }
575 567
576 // Allocate the resulting MemoryPoolMXBean[] object 568 // Allocate the resulting MemoryPoolMXBean[] object
577 klassOop k = Management::java_lang_management_MemoryPoolMXBean_klass(CHECK_NULL); 569 Klass* k = Management::java_lang_management_MemoryPoolMXBean_klass(CHECK_NULL);
578 instanceKlassHandle ik (THREAD, k); 570 instanceKlassHandle ik (THREAD, k);
579 objArrayOop r = oopFactory::new_objArray(ik(), num_memory_pools, CHECK_NULL); 571 objArrayOop r = oopFactory::new_objArray(ik(), num_memory_pools, CHECK_NULL);
580 objArrayHandle poolArray(THREAD, r); 572 objArrayHandle poolArray(THREAD, r);
581 573
582 if (mgr == NULL) { 574 if (mgr == NULL) {
617 } 609 }
618 num_mgrs = pool->num_memory_managers(); 610 num_mgrs = pool->num_memory_managers();
619 } 611 }
620 612
621 // Allocate the resulting MemoryManagerMXBean[] object 613 // Allocate the resulting MemoryManagerMXBean[] object
622 klassOop k = Management::java_lang_management_MemoryManagerMXBean_klass(CHECK_NULL); 614 Klass* k = Management::java_lang_management_MemoryManagerMXBean_klass(CHECK_NULL);
623 instanceKlassHandle ik (THREAD, k); 615 instanceKlassHandle ik (THREAD, k);
624 objArrayOop r = oopFactory::new_objArray(ik(), num_mgrs, CHECK_NULL); 616 objArrayOop r = oopFactory::new_objArray(ik(), num_mgrs, CHECK_NULL);
625 objArrayHandle mgrArray(THREAD, r); 617 objArrayHandle mgrArray(THREAD, r);
626 618
627 if (pool == NULL) { 619 if (pool == NULL) {
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(),
1304 } 1296 }
1305 1297
1306 int num_snapshots = dump_result.num_snapshots(); 1298 int num_snapshots = dump_result.num_snapshots();
1307 1299
1308 // create the result ThreadInfo[] object 1300 // create the result ThreadInfo[] object
1309 klassOop k = Management::java_lang_management_ThreadInfo_klass(CHECK_NULL); 1301 Klass* k = Management::java_lang_management_ThreadInfo_klass(CHECK_NULL);
1310 instanceKlassHandle ik (THREAD, k); 1302 instanceKlassHandle ik (THREAD, k);
1311 objArrayOop r = oopFactory::new_objArray(ik(), num_snapshots, CHECK_NULL); 1303 objArrayOop r = oopFactory::new_objArray(ik(), num_snapshots, CHECK_NULL);
1312 objArrayHandle result_h(THREAD, r); 1304 objArrayHandle result_h(THREAD, r);
1313 1305
1314 int index = 0; 1306 int index = 0;
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
1875 } 1867 }
1876 objArrayOop na = objArrayOop(JNIHandles::resolve_non_null(names)); 1868 objArrayOop na = objArrayOop(JNIHandles::resolve_non_null(names));
1877 objArrayHandle names_ah(THREAD, na); 1869 objArrayHandle names_ah(THREAD, na);
1878 1870
1879 // Make sure we have a String array 1871 // Make sure we have a String array
1880 klassOop element_klass = objArrayKlass::cast(names_ah->klass())->element_klass(); 1872 Klass* element_klass = objArrayKlass::cast(names_ah->klass())->element_klass();
1881 if (element_klass != SystemDictionary::String_klass()) { 1873 if (element_klass != SystemDictionary::String_klass()) {
1882 THROW_MSG_(vmSymbols::java_lang_IllegalArgumentException(), 1874 THROW_MSG_(vmSymbols::java_lang_IllegalArgumentException(),
1883 "Array element type is not String class", 0); 1875 "Array element type is not String class", 0);
1884 } 1876 }
1885 1877
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
2140 2132
2141 objArrayOop ca = objArrayOop(JNIHandles::resolve_non_null(cmds)); 2133 objArrayOop ca = objArrayOop(JNIHandles::resolve_non_null(cmds));
2142 objArrayHandle cmds_ah(THREAD, ca); 2134 objArrayHandle cmds_ah(THREAD, ca);
2143 2135
2144 // Make sure we have a String array 2136 // Make sure we have a String array
2145 klassOop element_klass = objArrayKlass::cast(cmds_ah->klass())->element_klass(); 2137 Klass* element_klass = objArrayKlass::cast(cmds_ah->klass())->element_klass();
2146 if (element_klass != SystemDictionary::String_klass()) { 2138 if (element_klass != SystemDictionary::String_klass()) {
2147 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), 2139 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
2148 "Array element type is not String class"); 2140 "Array element type is not String class");
2149 } 2141 }
2150 2142