482 bool operator()(WeakHandle<vm_string_table_data>* val) {
483 ++_item;
484 oop tmp = val->peek();
485 if (tmp == NULL) {
486 ++_count;
487 return true;
488 } else {
489 return false;
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);
|
482 bool operator()(WeakHandle<vm_string_table_data>* val) {
483 ++_item;
484 oop tmp = val->peek();
485 if (tmp == NULL) {
486 ++_count;
487 return true;
488 } else {
489 return false;
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 {
503 TraceTime timer("Clean", TRACETIME_LOG(Debug, stringtable, perf));
504 while(bdt.do_task(jt, stdc, stdd)) {
505 bdt.pause(jt);
506 {
507 ThreadBlockInVM tbivm(jt);
508 }
509 bdt.cont(jt);
510 }
511 bdt.done(jt);
512 }
513 log_debug(stringtable)("Cleaned %ld of %ld", stdc._count, stdc._item);
514 }
515
516 void StringTable::check_concurrent_work() {
517 if (_has_work) {
518 return;
519 }
520
521 double load_factor = StringTable::get_load_factor();
522 double dead_factor = StringTable::get_dead_factor();
523 // We should clean/resize if we have more dead than alive,
524 // more items than preferred load factor or
525 // more dead items than water mark.
526 if ((dead_factor > load_factor) ||
527 (load_factor > PREF_AVG_LIST_LEN) ||
528 (dead_factor > CLEAN_DEAD_HIGH_WATER_MARK)) {
529 log_debug(stringtable)("Concurrent work triggered, live factor:%g dead factor:%g",
530 load_factor, dead_factor);
|