165 class_size += k->size(); 166 167 if (k->oop_is_instance()) { 168 class_size += k->methods()->size(); 169 // FIXME: Need to count the contents of methods 170 class_size += k->constants()->size(); 171 class_size += k->local_interfaces()->size(); 172 class_size += k->transitive_interfaces()->size(); 173 // We do not have to count implementors, since we only store one! 174 // FIXME: How should these be accounted for, now when they have moved. 175 //class_size += k->fields()->size(); 176 } 177 return class_size * oopSize; 178 } 179 180 bool ClassLoadingService::set_verbose(bool verbose) { 181 MutexLocker m(Management_lock); 182 183 // verbose will be set to the previous value 184 Flag::Error error = CommandLineFlags::boolAtPut("TraceClassLoading", &verbose, Flag::MANAGEMENT); 185 assert(error==Flag::SUCCESS, err_msg("Setting TraceClassLoading flag failed with error %s", Flag::flag_error_str(error))); 186 reset_trace_class_unloading(); 187 188 return verbose; 189 } 190 191 // Caller to this function must own Management_lock 192 void ClassLoadingService::reset_trace_class_unloading() { 193 assert(Management_lock->owned_by_self(), "Must own the Management_lock"); 194 bool value = MemoryService::get_verbose() || ClassLoadingService::get_verbose(); 195 Flag::Error error = CommandLineFlags::boolAtPut("TraceClassUnloading", &value, Flag::MANAGEMENT); 196 assert(error==Flag::SUCCESS, err_msg("Setting TraceClassUnLoading flag failed with error %s", Flag::flag_error_str(error))); 197 } 198 199 GrowableArray<KlassHandle>* LoadedClassesEnumerator::_loaded_classes = NULL; 200 Thread* LoadedClassesEnumerator::_current_thread = NULL; 201 202 LoadedClassesEnumerator::LoadedClassesEnumerator(Thread* cur_thread) { 203 assert(cur_thread == Thread::current(), "Check current thread"); 204 205 int init_size = ClassLoadingService::loaded_class_count(); 206 _klass_handle_array = new GrowableArray<KlassHandle>(init_size); 207 208 // For consistency of the loaded classes, grab the SystemDictionary lock 209 MutexLocker sd_mutex(SystemDictionary_lock); 210 211 // Set _loaded_classes and _current_thread and begin enumerating all classes. 212 // Only one thread will do the enumeration at a time. 213 // These static variables are needed and they are used by the static method 214 // add_loaded_class called from classes_do(). 215 _loaded_classes = _klass_handle_array; 216 _current_thread = cur_thread; | 165 class_size += k->size(); 166 167 if (k->oop_is_instance()) { 168 class_size += k->methods()->size(); 169 // FIXME: Need to count the contents of methods 170 class_size += k->constants()->size(); 171 class_size += k->local_interfaces()->size(); 172 class_size += k->transitive_interfaces()->size(); 173 // We do not have to count implementors, since we only store one! 174 // FIXME: How should these be accounted for, now when they have moved. 175 //class_size += k->fields()->size(); 176 } 177 return class_size * oopSize; 178 } 179 180 bool ClassLoadingService::set_verbose(bool verbose) { 181 MutexLocker m(Management_lock); 182 183 // verbose will be set to the previous value 184 Flag::Error error = CommandLineFlags::boolAtPut("TraceClassLoading", &verbose, Flag::MANAGEMENT); 185 assert(error==Flag::SUCCESS, "Setting TraceClassLoading flag failed with error %s", Flag::flag_error_str(error)); 186 reset_trace_class_unloading(); 187 188 return verbose; 189 } 190 191 // Caller to this function must own Management_lock 192 void ClassLoadingService::reset_trace_class_unloading() { 193 assert(Management_lock->owned_by_self(), "Must own the Management_lock"); 194 bool value = MemoryService::get_verbose() || ClassLoadingService::get_verbose(); 195 Flag::Error error = CommandLineFlags::boolAtPut("TraceClassUnloading", &value, Flag::MANAGEMENT); 196 assert(error==Flag::SUCCESS, "Setting TraceClassUnLoading flag failed with error %s", Flag::flag_error_str(error)); 197 } 198 199 GrowableArray<KlassHandle>* LoadedClassesEnumerator::_loaded_classes = NULL; 200 Thread* LoadedClassesEnumerator::_current_thread = NULL; 201 202 LoadedClassesEnumerator::LoadedClassesEnumerator(Thread* cur_thread) { 203 assert(cur_thread == Thread::current(), "Check current thread"); 204 205 int init_size = ClassLoadingService::loaded_class_count(); 206 _klass_handle_array = new GrowableArray<KlassHandle>(init_size); 207 208 // For consistency of the loaded classes, grab the SystemDictionary lock 209 MutexLocker sd_mutex(SystemDictionary_lock); 210 211 // Set _loaded_classes and _current_thread and begin enumerating all classes. 212 // Only one thread will do the enumeration at a time. 213 // These static variables are needed and they are used by the static method 214 // add_loaded_class called from classes_do(). 215 _loaded_classes = _klass_handle_array; 216 _current_thread = cur_thread; |