397 // CDS code for dumping shared archive. 398 399 // Global object for holding classes that have been loaded. Since this 400 // is run at a safepoint just before exit, this is the entire set of classes. 401 static GrowableArray<Klass*>* _global_klass_objects; 402 403 static void collect_array_classes(Klass* k) { 404 _global_klass_objects->append_if_missing(k); 405 if (k->is_array_klass()) { 406 // Add in the array classes too 407 ArrayKlass* ak = ArrayKlass::cast(k); 408 Klass* h = ak->higher_dimension(); 409 if (h != NULL) { 410 h->array_klasses_do(collect_array_classes); 411 } 412 } 413 } 414 415 class CollectClassesClosure : public KlassClosure { 416 void do_klass(Klass* k) { 417 if (!(k->is_instance_klass() && InstanceKlass::cast(k)->is_in_error_state())) { 418 _global_klass_objects->append_if_missing(k); 419 } 420 if (k->is_array_klass()) { 421 // Add in the array classes too 422 ArrayKlass* ak = ArrayKlass::cast(k); 423 Klass* h = ak->higher_dimension(); 424 if (h != NULL) { 425 h->array_klasses_do(collect_array_classes); 426 } 427 } 428 } 429 }; 430 431 static void remove_unshareable_in_classes() { 432 for (int i = 0; i < _global_klass_objects->length(); i++) { 433 Klass* k = _global_klass_objects->at(i); 434 if (!k->is_objArray_klass()) { 435 // InstanceKlass and TypeArrayKlass will in turn call remove_unshareable_info 436 // on their array classes. | 397 // CDS code for dumping shared archive. 398 399 // Global object for holding classes that have been loaded. Since this 400 // is run at a safepoint just before exit, this is the entire set of classes. 401 static GrowableArray<Klass*>* _global_klass_objects; 402 403 static void collect_array_classes(Klass* k) { 404 _global_klass_objects->append_if_missing(k); 405 if (k->is_array_klass()) { 406 // Add in the array classes too 407 ArrayKlass* ak = ArrayKlass::cast(k); 408 Klass* h = ak->higher_dimension(); 409 if (h != NULL) { 410 h->array_klasses_do(collect_array_classes); 411 } 412 } 413 } 414 415 class CollectClassesClosure : public KlassClosure { 416 void do_klass(Klass* k) { 417 if (!UseAppCDS && !k->class_loader_data()->is_the_null_class_loader_data()) { 418 // AppCDS is not enabled. Let's omit non-boot classes. 419 return; 420 } 421 422 if (!(k->is_instance_klass() && InstanceKlass::cast(k)->is_in_error_state())) { 423 _global_klass_objects->append_if_missing(k); 424 } 425 if (k->is_array_klass()) { 426 // Add in the array classes too 427 ArrayKlass* ak = ArrayKlass::cast(k); 428 Klass* h = ak->higher_dimension(); 429 if (h != NULL) { 430 h->array_klasses_do(collect_array_classes); 431 } 432 } 433 } 434 }; 435 436 static void remove_unshareable_in_classes() { 437 for (int i = 0; i < _global_klass_objects->length(); i++) { 438 Klass* k = _global_klass_objects->at(i); 439 if (!k->is_objArray_klass()) { 440 // InstanceKlass and TypeArrayKlass will in turn call remove_unshareable_info 441 // on their array classes. |