< prev index next >

src/hotspot/share/classfile/stringTable.cpp

Print this page
rev 50748 : 8205583: Crash in ConcurrentHashTable do_bulk_delete_locked_for
Reviewed-by:


 490     }
 491   }
 492 };
 493 
 494 void StringTable::clean_dead_entries(JavaThread* jt) {
 495   StringTableHash::BulkDeleteTask bdt(_local_table);
 496   if (!bdt.prepare(jt)) {
 497     return;
 498   }
 499 
 500   StringTableDeleteCheck stdc;
 501   StringTableDoDelete stdd;
 502   bool interrupted = false;
 503   {
 504     TraceTime timer("Clean", TRACETIME_LOG(Debug, stringtable, perf));
 505     while(bdt.do_task(jt, stdc, stdd)) {
 506       bdt.pause(jt);
 507       {
 508         ThreadBlockInVM tbivm(jt);
 509       }
 510       if (!bdt.cont(jt)) {
 511         interrupted = true;
 512         break;
 513       }
 514     }
 515   }
 516   if (interrupted) {
 517     _has_work = true;
 518   } else {
 519     bdt.done(jt);
 520   }
 521   log_debug(stringtable)("Cleaned %ld of %ld", stdc._count, stdc._item);
 522 }
 523 
 524 void StringTable::check_concurrent_work() {
 525   if (_has_work) {
 526     return;
 527   }
 528 
 529   double load_factor = StringTable::get_load_factor();
 530   double dead_factor = StringTable::get_dead_factor();
 531   // We should clean/resize if we have more dead than alive,
 532   // more items than preferred load factor or
 533   // more dead items than water mark.
 534   if ((dead_factor > load_factor) ||
 535       (load_factor > PREF_AVG_LIST_LEN) ||
 536       (dead_factor > CLEAN_DEAD_HIGH_WATER_MARK)) {
 537     log_debug(stringtable)("Concurrent work triggered, live factor:%g dead factor:%g",
 538                            load_factor, dead_factor);




 490     }
 491   }
 492 };
 493 
 494 void StringTable::clean_dead_entries(JavaThread* jt) {
 495   StringTableHash::BulkDeleteTask bdt(_local_table);
 496   if (!bdt.prepare(jt)) {
 497     return;
 498   }
 499 
 500   StringTableDeleteCheck stdc;
 501   StringTableDoDelete stdd;
 502   bool interrupted = false;
 503   {
 504     TraceTime timer("Clean", TRACETIME_LOG(Debug, stringtable, perf));
 505     while(bdt.do_task(jt, stdc, stdd)) {
 506       bdt.pause(jt);
 507       {
 508         ThreadBlockInVM tbivm(jt);
 509       }
 510       bdt.cont(jt);


 511     }





 512     bdt.done(jt);
 513   }
 514   log_debug(stringtable)("Cleaned %ld of %ld", stdc._count, stdc._item);
 515 }
 516 
 517 void StringTable::check_concurrent_work() {
 518   if (_has_work) {
 519     return;
 520   }
 521 
 522   double load_factor = StringTable::get_load_factor();
 523   double dead_factor = StringTable::get_dead_factor();
 524   // We should clean/resize if we have more dead than alive,
 525   // more items than preferred load factor or
 526   // more dead items than water mark.
 527   if ((dead_factor > load_factor) ||
 528       (load_factor > PREF_AVG_LIST_LEN) ||
 529       (dead_factor > CLEAN_DEAD_HIGH_WATER_MARK)) {
 530     log_debug(stringtable)("Concurrent work triggered, live factor:%g dead factor:%g",
 531                            load_factor, dead_factor);


< prev index next >