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::remove_handle_unsafe(OopHandle h) { 768 oop* obj = h.ptr(); 769 assert(_handles.contains(obj), "Got unexpected handle " PTR_FORMAT, p2i(obj)); 770 *(obj) = NULL; 771 } 772 773 // Add this metadata pointer to be freed when it's safe. This is only during 774 // class unloading because Handles might point to this metadata field. 775 void ClassLoaderData::add_to_deallocate_list(Metadata* m) { 776 // Metadata in shared region isn't deleted. 777 if (!m->is_shared()) { 778 MutexLockerEx ml(metaspace_lock(), Mutex::_no_safepoint_check_flag); 779 if (_deallocate_list == NULL) { 780 _deallocate_list = new (ResourceObj::C_HEAP, mtClass) GrowableArray<Metadata*>(100, true); 781 } 782 _deallocate_list->append_if_missing(m); 783 } 784 } 785 786 // Deallocate free metadata on the free list. How useful the PermGen was! 787 void ClassLoaderData::free_deallocate_list() { 788 // Don't need lock, at safepoint 789 assert(SafepointSynchronize::is_at_safepoint(), "only called at safepoint"); 790 if (_deallocate_list == NULL) { |