742 } else if (is_anonymous()) { 743 if (class_loader() != NULL) { 744 log_trace(class, loader, data)("is_anonymous: %s", class_loader()->klass()->internal_name()); 745 } 746 metaspace = new Metaspace(_metaspace_lock, Metaspace::AnonymousMetaspaceType); 747 } else if (class_loader()->is_a(SystemDictionary::reflect_DelegatingClassLoader_klass())) { 748 if (class_loader() != NULL) { 749 log_trace(class, loader, data)("is_reflection: %s", class_loader()->klass()->internal_name()); 750 } 751 metaspace = new Metaspace(_metaspace_lock, Metaspace::ReflectionMetaspaceType); 752 } else { 753 metaspace = new Metaspace(_metaspace_lock, Metaspace::StandardMetaspaceType); 754 } 755 // Ensure _metaspace is stable, since it is examined without a lock 756 OrderAccess::release_store_ptr(&_metaspace, metaspace); 757 } 758 } 759 return metaspace; 760 } 761 762 jobject ClassLoaderData::add_handle(Handle h) { 763 MutexLockerEx ml(metaspace_lock(), Mutex::_no_safepoint_check_flag); 764 return (jobject) _handles.add(h()); 765 } 766 767 void ClassLoaderData::remove_handle_unsafe(jobject h) { 768 assert(_handles.contains((oop*) h), "Got unexpected handle " PTR_FORMAT, p2i((oop*) h)); 769 *((oop*) h) = NULL; 770 } 771 772 // Add this metadata pointer to be freed when it's safe. This is only during 773 // class unloading because Handles might point to this metadata field. 774 void ClassLoaderData::add_to_deallocate_list(Metadata* m) { 775 // Metadata in shared region isn't deleted. 776 if (!m->is_shared()) { 777 MutexLockerEx ml(metaspace_lock(), Mutex::_no_safepoint_check_flag); 778 if (_deallocate_list == NULL) { 779 _deallocate_list = new (ResourceObj::C_HEAP, mtClass) GrowableArray<Metadata*>(100, true); 780 } 781 _deallocate_list->append_if_missing(m); 782 } 783 } 784 785 // Deallocate free metadata on the free list. How useful the PermGen was! 786 void ClassLoaderData::free_deallocate_list() { 787 // Don't need lock, at safepoint 788 assert(SafepointSynchronize::is_at_safepoint(), "only called at safepoint"); 789 if (_deallocate_list == NULL) { | 742 } else if (is_anonymous()) { 743 if (class_loader() != NULL) { 744 log_trace(class, loader, data)("is_anonymous: %s", class_loader()->klass()->internal_name()); 745 } 746 metaspace = new Metaspace(_metaspace_lock, Metaspace::AnonymousMetaspaceType); 747 } else if (class_loader()->is_a(SystemDictionary::reflect_DelegatingClassLoader_klass())) { 748 if (class_loader() != NULL) { 749 log_trace(class, loader, data)("is_reflection: %s", class_loader()->klass()->internal_name()); 750 } 751 metaspace = new Metaspace(_metaspace_lock, Metaspace::ReflectionMetaspaceType); 752 } else { 753 metaspace = new Metaspace(_metaspace_lock, Metaspace::StandardMetaspaceType); 754 } 755 // Ensure _metaspace is stable, since it is examined without a lock 756 OrderAccess::release_store_ptr(&_metaspace, metaspace); 757 } 758 } 759 return metaspace; 760 } 761 762 OopHandle ClassLoaderData::add_handle(Handle h) { 763 MutexLockerEx ml(metaspace_lock(), Mutex::_no_safepoint_check_flag); 764 return OopHandle(_handles.add(h())); 765 } 766 767 void ClassLoaderData::init_handle_locked(OopHandle& dest, Handle h) { 768 MutexLockerEx ml(metaspace_lock(), Mutex::_no_safepoint_check_flag); 769 if (dest.resolve() != NULL) { 770 return; 771 } else { 772 dest = _handles.add(h()); 773 } 774 } 775 776 // Add this metadata pointer to be freed when it's safe. This is only during 777 // class unloading because Handles might point to this metadata field. 778 void ClassLoaderData::add_to_deallocate_list(Metadata* m) { 779 // Metadata in shared region isn't deleted. 780 if (!m->is_shared()) { 781 MutexLockerEx ml(metaspace_lock(), Mutex::_no_safepoint_check_flag); 782 if (_deallocate_list == NULL) { 783 _deallocate_list = new (ResourceObj::C_HEAP, mtClass) GrowableArray<Metadata*>(100, true); 784 } 785 _deallocate_list->append_if_missing(m); 786 } 787 } 788 789 // Deallocate free metadata on the free list. How useful the PermGen was! 790 void ClassLoaderData::free_deallocate_list() { 791 // Don't need lock, at safepoint 792 assert(SafepointSynchronize::is_at_safepoint(), "only called at safepoint"); 793 if (_deallocate_list == NULL) { |