< prev index next >

src/hotspot/share/oops/instanceKlass.cpp

Print this page




1884 #ifndef PRODUCT
1885 void InstanceKlass::print_dependent_nmethods(bool verbose) {
1886   dependencies().print_dependent_nmethods(verbose);
1887 }
1888 
1889 bool InstanceKlass::is_dependent_nmethod(nmethod* nm) {
1890   return dependencies().is_dependent_nmethod(nm);
1891 }
1892 #endif //PRODUCT
1893 
1894 void InstanceKlass::clean_weak_instanceklass_links(BoolObjectClosure* is_alive) {
1895   clean_implementors_list(is_alive);
1896   clean_method_data(is_alive);
1897 
1898   // Since GC iterates InstanceKlasses sequentially, it is safe to remove stale entries here.
1899   DependencyContext dep_context(&_dep_context);
1900   dep_context.expunge_stale_entries();
1901 }
1902 
1903 void InstanceKlass::clean_implementors_list(BoolObjectClosure* is_alive) {
1904   assert(class_loader_data()->is_alive(is_alive), "this klass should be live");
1905   if (is_interface()) {
1906     if (ClassUnloading) {
1907       Klass* impl = implementor();
1908       if (impl != NULL) {
1909         if (!impl->is_loader_alive(is_alive)) {
1910           // remove this guy
1911           Klass** klass = adr_implementor();
1912           assert(klass != NULL, "null klass");
1913           if (klass != NULL) {
1914             *klass = NULL;
1915           }
1916         }
1917       }
1918     }
1919   }
1920 }
1921 
1922 void InstanceKlass::clean_method_data(BoolObjectClosure* is_alive) {
1923   for (int m = 0; m < methods()->length(); m++) {
1924     MethodData* mdo = methods()->at(m)->method_data();




1884 #ifndef PRODUCT
1885 void InstanceKlass::print_dependent_nmethods(bool verbose) {
1886   dependencies().print_dependent_nmethods(verbose);
1887 }
1888 
1889 bool InstanceKlass::is_dependent_nmethod(nmethod* nm) {
1890   return dependencies().is_dependent_nmethod(nm);
1891 }
1892 #endif //PRODUCT
1893 
1894 void InstanceKlass::clean_weak_instanceklass_links(BoolObjectClosure* is_alive) {
1895   clean_implementors_list(is_alive);
1896   clean_method_data(is_alive);
1897 
1898   // Since GC iterates InstanceKlasses sequentially, it is safe to remove stale entries here.
1899   DependencyContext dep_context(&_dep_context);
1900   dep_context.expunge_stale_entries();
1901 }
1902 
1903 void InstanceKlass::clean_implementors_list(BoolObjectClosure* is_alive) {
1904   assert(class_loader_data()->is_alive(), "this klass should be live");
1905   if (is_interface()) {
1906     if (ClassUnloading) {
1907       Klass* impl = implementor();
1908       if (impl != NULL) {
1909         if (!impl->is_loader_alive(is_alive)) {
1910           // remove this guy
1911           Klass** klass = adr_implementor();
1912           assert(klass != NULL, "null klass");
1913           if (klass != NULL) {
1914             *klass = NULL;
1915           }
1916         }
1917       }
1918     }
1919   }
1920 }
1921 
1922 void InstanceKlass::clean_method_data(BoolObjectClosure* is_alive) {
1923   for (int m = 0; m < methods()->length(); m++) {
1924     MethodData* mdo = methods()->at(m)->method_data();


< prev index next >