< prev index next >

src/share/vm/classfile/classLoaderData.cpp

Print this page




 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) {


< prev index next >