comparison src/share/vm/code/codeCache.cpp @ 14262:3aaa4b9966f6

7194669: CodeCache::mark_for_deoptimization should avoid verifying dependencies multiple times Summary: Avoid verifying dependencies multiple times by caching verified dependencies Reviewed-by: kvn, twisti, roland
author anoll
date Wed, 15 Jan 2014 06:16:55 +0100
parents 510fbd28919c
children 524b54a7f1b5
comparison
equal deleted inserted replaced
14260:8cdf3f43f63e 14262:3aaa4b9966f6
594 nm->clear_inline_caches(); 594 nm->clear_inline_caches();
595 } 595 }
596 } 596 }
597 597
598 #ifndef PRODUCT 598 #ifndef PRODUCT
599 // used to keep track of how much time is spent in mark_for_deoptimization 599 // Keeps track of time spent for checking dependencies
600 static elapsedTimer dependentCheckTime; 600 static elapsedTimer dependentCheckTime;
601 static int dependentCheckCount = 0; 601 #endif
602 #endif // PRODUCT
603 602
604 603
605 int CodeCache::mark_for_deoptimization(DepChange& changes) { 604 int CodeCache::mark_for_deoptimization(DepChange& changes) {
606 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag); 605 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
607
608 #ifndef PRODUCT
609 dependentCheckTime.start();
610 dependentCheckCount++;
611 #endif // PRODUCT
612
613 int number_of_marked_CodeBlobs = 0; 606 int number_of_marked_CodeBlobs = 0;
614 607
615 // search the hierarchy looking for nmethods which are affected by the loading of this class 608 // search the hierarchy looking for nmethods which are affected by the loading of this class
616 609
617 // then search the interfaces this class implements looking for nmethods 610 // then search the interfaces this class implements looking for nmethods
618 // which might be dependent of the fact that an interface only had one 611 // which might be dependent of the fact that an interface only had one
619 // implementor. 612 // implementor.
620 613 // nmethod::check_all_dependencies works only correctly, if no safepoint
621 { No_Safepoint_Verifier nsv; 614 // can happen
622 for (DepChange::ContextStream str(changes, nsv); str.next(); ) { 615 No_Safepoint_Verifier nsv;
623 Klass* d = str.klass(); 616 for (DepChange::ContextStream str(changes, nsv); str.next(); ) {
624 number_of_marked_CodeBlobs += InstanceKlass::cast(d)->mark_dependent_nmethods(changes); 617 Klass* d = str.klass();
625 } 618 number_of_marked_CodeBlobs += InstanceKlass::cast(d)->mark_dependent_nmethods(changes);
626 } 619 }
627 620
621 #ifndef PRODUCT
628 if (VerifyDependencies) { 622 if (VerifyDependencies) {
629 // Turn off dependency tracing while actually testing deps. 623 // Object pointers are used as unique identifiers for dependency arguments. This
630 NOT_PRODUCT( FlagSetting fs(TraceDependencies, false) ); 624 // is only possible if no safepoint, i.e., GC occurs during the verification code.
631 FOR_ALL_ALIVE_NMETHODS(nm) { 625 dependentCheckTime.start();
632 if (!nm->is_marked_for_deoptimization() && 626 nmethod::check_all_dependencies(changes);
633 nm->check_all_dependencies()) { 627 dependentCheckTime.stop();
634 ResourceMark rm; 628 }
635 tty->print_cr("Should have been marked for deoptimization:"); 629 #endif
636 changes.print();
637 nm->print();
638 nm->print_dependencies();
639 }
640 }
641 }
642
643 #ifndef PRODUCT
644 dependentCheckTime.stop();
645 #endif // PRODUCT
646 630
647 return number_of_marked_CodeBlobs; 631 return number_of_marked_CodeBlobs;
648 } 632 }
649 633
650 634
897 live.add(p); 881 live.add(p);
898 } 882 }
899 } 883 }
900 884
901 tty->print_cr("CodeCache:"); 885 tty->print_cr("CodeCache:");
902 886 tty->print_cr("nmethod dependency checking time %fs", dependentCheckTime.seconds());
903 tty->print_cr("nmethod dependency checking time %f", dependentCheckTime.seconds(),
904 dependentCheckTime.seconds() / dependentCheckCount);
905 887
906 if (!live.is_empty()) { 888 if (!live.is_empty()) {
907 live.print("live"); 889 live.print("live");
908 } 890 }
909 if (!dead.is_empty()) { 891 if (!dead.is_empty()) {