Index: vm/vmcore/include/classloader.h =================================================================== --- vm/vmcore/include/classloader.h (revision 518867) +++ vm/vmcore/include/classloader.h (working copy) @@ -155,8 +155,8 @@ public: ClassLoader() : m_loader(NULL), m_parent(NULL), m_name(NULL), m_package_table(NULL), m_loadedClasses(NULL), m_loadingClasses(NULL), m_reportedClasses(NULL), - m_javaTypes(NULL), m_nativeLibraries(NULL), m_markBit(0), - m_unloading(false), m_fullSize(0), m_verifyData(NULL) + m_javaTypes(NULL), m_nativeLibraries(NULL), m_markBit(false), + m_fullSize(0), m_verifyData(NULL) { apr_pool_create(&pool, 0); } @@ -230,8 +230,6 @@ static void UnloadClassLoader( ManagedObject* loader ); static void gc_enumerate(); static void ClearMarkBits(); - static void StartUnloading(); - static void PrintUnloadingStats(); static unsigned GetClassLoaderNumber() { return m_nextEntry; } static ClassLoader** GetClassLoaderTable() { return m_table; } static void DeleteClassLoaderTable(){ @@ -280,8 +278,7 @@ NativeLibraryList m_nativeLibraries; Lock_Manager m_lock; Lock_Manager m_types_cache_lock; - unsigned m_markBit:1; - unsigned m_unloading; + bool m_markBit; unsigned m_fullSize; void* m_verifyData; apr_pool_t* pool; Index: vm/vmcore/include/Class.h =================================================================== --- vm/vmcore/include/Class.h (revision 518867) +++ vm/vmcore/include/Class.h (working copy) @@ -1021,9 +1021,6 @@ // SourceDebugExtension class attribute support String* m_sourceDebugExtension; - // struct Class accessibility for unloading - unsigned m_markBit:1; - // verifier private data pointer void* m_verify_data; @@ -1750,20 +1747,6 @@ return m_sourceDebugExtension->bytes; } - // Class unloading support - - /** Checks whether the given class is reachable through its loader - * or any live object. - * @return true if the given class is reachable, - * otherwise false.*/ - bool is_reachable() { return m_markBit == 1; } - - /** Clears a reachability mark.*/ - void reset_reachable() { m_markBit = 0; } - - /** Marks the given class as reachable.*/ - void mark_reachable() { m_markBit = 1; } - /** Stores a verifier specific pointer into the given class. * @param[in] data - a verifier specific data pointer*/ void set_verification_data(void* data) { Index: vm/vmcore/include/unloading.h =================================================================== --- vm/vmcore/include/unloading.h (revision 518867) +++ vm/vmcore/include/unloading.h (working copy) @@ -23,7 +23,6 @@ #define __UNLOADING_H__ void class_unloading_clear_mark_bits(); -void class_unloading_start(); #endif Index: vm/vmcore/src/gc/stop_the_world_root_set_enum.cpp =================================================================== --- vm/vmcore/src/gc/stop_the_world_root_set_enum.cpp (revision 518867) +++ vm/vmcore/src/gc/stop_the_world_root_set_enum.cpp (working copy) @@ -163,8 +163,6 @@ assert(p_the_safepoint_control_thread == p_TLS_vmthread); p_the_safepoint_control_thread = 0; - class_unloading_start(); - jvmti_send_gc_finish_event(); jvmti_clean_reclaimed_object_tags(); Index: vm/vmcore/src/class_support/Class.cpp =================================================================== --- vm/vmcore/src/class_support/Class.cpp (revision 518867) +++ vm/vmcore/src/class_support/Class.cpp (working copy) @@ -141,7 +141,6 @@ m_sourceDebugExtension = NULL; m_lock = new Lock_Manager(); - m_markBit = 0; m_verify_data = 0; } @@ -922,17 +921,6 @@ } -static void mark_classloader(ClassLoader* cl) -{ - if(cl->GetLoader() && cl->NotMarked()) { - TRACE2("classloader.unloading.markloader", " Marking loader " - << cl << " (" << (void*)cl->GetLoader() << " : " - << cl->GetLoader()->vt()->clss->get_name()->bytes << ")"); - cl->Mark(); - } -} - - // end pointers between struct Class and java.lang.Class //////////////////////////////////////////////////////////////////// Index: vm/vmcore/src/class_support/classloader.cpp =================================================================== --- vm/vmcore/src/class_support/classloader.cpp (revision 518867) +++ vm/vmcore/src/class_support/classloader.cpp (working copy) @@ -491,97 +491,16 @@ ClassTable::iterator cti; unsigned i; for(i = 0; i < m_nextEntry; i++) { - if(m_table[i]->m_unloading) { - TRACE2("classloader.unloading.debug", " Skipping \"unloaded\" classloader " - << m_table[i] << " (" << m_table[i]->m_loader << " : " - << ((VTable*)(*(unsigned**)(m_table[i]->m_loader)))->clss->get_name()->bytes << ")"); - continue; - } - TRACE2("classloader.unloading.debug", " Clearing mark bits in classloader " + TRACE2("classloader.unloading.debug", " Clearing mark bits in classloaders " << m_table[i] << " (" << m_table[i]->m_loader << " : " - << ((VTable*)(*(unsigned**)(m_table[i]->m_loader)))->clss->get_name()->bytes << ") and its classes"); + << m_table[i]->m_loader->vt_unsafe()->clss->get_name()->bytes << ") and its classes"); // clear mark bits in loader and classes m_table[i]->m_markBit = 0; - for(cti = m_table[i]->m_loadedClasses->begin(); - cti != m_table[i]->m_loadedClasses->end(); cti++) - { - if(cti->second->get_class_loader() == m_table[i]) { - cti->second->reset_reachable(); - } - } } TRACE2("classloader.unloading.clear", "Finished clearing mark bits"); - TRACE2("classloader.unloading.marking", "Starting mark loaders"); } -void ClassLoader::StartUnloading() -{ - TRACE2("classloader.unloading.marking", "Finished marking loaders"); - TRACE2("classloader.unloading.do", "Start checking loaders ready to be unloaded"); - LMAutoUnlock aulock( &(ClassLoader::m_tableLock) ); - unsigned i; - for(i = 0; i < m_nextEntry; i++) { - if(m_table[i]->m_unloading) { - TRACE2("classloader.unloading.debug", " Skipping \"unloaded\" classloader " - << m_table[i] << " (" << m_table[i]->m_loader << " : " - << ((VTable*)(*(unsigned**)(m_table[i]->m_loader)))->clss->get_name()->bytes << ")"); - continue; - } - TRACE2("classloader.unloading.debug", " Scanning loader " - << m_table[i] << " (" << m_table[i]->m_loader << " : " - << ((VTable*)(*(unsigned**)(m_table[i]->m_loader)))->clss->get_name()->bytes << ")"); - if(!m_table[i]->m_markBit) { - TRACE2("classloader.unloading.stats", " (!) Ready to unload classloader " - << m_table[i] << " (" << m_table[i]->m_loader << " : " - << ((VTable*)(*(unsigned**)(m_table[i]->m_loader)))->clss->get_name()->bytes << ")"); - TRACE2("classloader.unloading.stats", " (!) This will free " - << m_table[i]->GetFullSize() << " bytes in C heap"); - m_table[i]->m_unloading = true; - m_unloadedBytes += m_table[i]->GetFullSize(); - } - } - TRACE2("classloader.unloading.do", "Finished checking loaders"); -} - - -void ClassLoader::PrintUnloadingStats() -{ - unsigned i; - TRACE2("classloader.unloading.stats", "----------------------------------------------"); - TRACE2("classloader.unloading.stats", "Class unloading statistics:"); - hythread_suspend_disable(); - for(i = 0; i < m_nextEntry; i++) { - if(m_table[i]->m_unloading) { - TRACE2("classloader.unloading.stats", " Class loader " - << m_table[i] << " (" << m_table[i]->m_loader << " : " - << ((VTable*)(*(unsigned**)(m_table[i]->m_loader)))->clss->get_name()->bytes - << ") contains " << m_table[i]->GetFullSize() << " bytes in C heap"); - } - } - hythread_suspend_enable(); - TRACE2("classloader.unloading.stats", "A total of " - << m_unloadedBytes << " bytes would be freed in C heap for this scenario"); - TRACE2("classloader.unloading.stats", "----------------------------------------------"); -} - - -void vm_classloader_iterate_objects(void *iterator) { - - // skip the object iteration if it is not needed - // (logging is not enabled and - // class unloading is not yet implemented). - if (!is_info_enabled("class_unload")) return; - - Managed_Object_Handle obj; - int nobjects = 0; - while((obj = gc_get_next_live_object(iterator))) { - nobjects++; - } - INFO2("class_unload", "classloader_iterate_objects " << nobjects << " iterated"); -} - - ClassLoader* ClassLoader::AddClassLoader( ManagedObject* loader ) { SuspendDisabledChecker sdc; @@ -1115,10 +1034,6 @@ ClassLoader::ClearMarkBits(); } -void class_unloading_start() { - ClassLoader::StartUnloading(); -} - inline void BootstrapClassLoader::SetClasspathFromString(char* bcp, apr_pool_t* tmp_pool) Index: vm/vmcore/src/init/vm_shutdown.cpp =================================================================== --- vm/vmcore/src/init/vm_shutdown.cpp (revision 518867) +++ vm/vmcore/src/init/vm_shutdown.cpp (working copy) @@ -172,7 +172,6 @@ // Print out gathered data. #ifdef VM_STATS - ClassLoader::PrintUnloadingStats(); VM_Statistics::get_vm_stats().print(); #endif