comparison src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp @ 518:0af8b0718fc9

6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark" Summary: The CMS concurrent precleaning and concurrent marking phases should work around classes that are undergoing redefinition. Reviewed-by: ysr, dcubed
author jmasa
date Sun, 11 Jan 2009 16:58:24 -0800
parents e9be0e04635a
children 5cfd8d19e546
comparison
equal deleted inserted replaced
517:e9be0e04635a 518:0af8b0718fc9
6631 return 0; 6631 return 0;
6632 } 6632 }
6633 if (_bitMap->isMarked(addr)) { 6633 if (_bitMap->isMarked(addr)) {
6634 // it's marked; is it potentially uninitialized? 6634 // it's marked; is it potentially uninitialized?
6635 if (p->klass_or_null() != NULL) { 6635 if (p->klass_or_null() != NULL) {
6636 if (CMSPermGenPrecleaningEnabled && !p->is_parsable()) { 6636 // If is_conc_safe is false, the object may be undergoing
6637 // change by the VM outside a safepoint. Don't try to
6638 // scan it, but rather leave it for the remark phase.
6639 if (CMSPermGenPrecleaningEnabled &&
6640 (!p->is_conc_safe() || !p->is_parsable())) {
6637 // Signal precleaning to redirty the card since 6641 // Signal precleaning to redirty the card since
6638 // the klass pointer is already installed. 6642 // the klass pointer is already installed.
6639 assert(size == 0, "Initial value"); 6643 assert(size == 0, "Initial value");
6640 } else { 6644 } else {
6641 assert(p->is_parsable(), "must be parsable."); 6645 assert(p->is_parsable(), "must be parsable.");
8069 "alignment problem"); 8073 "alignment problem");
8070 8074
8071 #ifdef DEBUG 8075 #ifdef DEBUG
8072 if (oop(addr)->klass_or_null() != NULL && 8076 if (oop(addr)->klass_or_null() != NULL &&
8073 ( !_collector->should_unload_classes() 8077 ( !_collector->should_unload_classes()
8074 || oop(addr)->is_parsable())) { 8078 || (oop(addr)->is_parsable()) &&
8079 oop(addr)->is_conc_safe())) {
8075 // Ignore mark word because we are running concurrent with mutators 8080 // Ignore mark word because we are running concurrent with mutators
8076 assert(oop(addr)->is_oop(true), "live block should be an oop"); 8081 assert(oop(addr)->is_oop(true), "live block should be an oop");
8082 // is_conc_safe is checked before performing this assertion
8083 // because an object that is not is_conc_safe may yet have
8084 // the return from size() correct.
8077 assert(size == 8085 assert(size ==
8078 CompactibleFreeListSpace::adjustObjectSize(oop(addr)->size()), 8086 CompactibleFreeListSpace::adjustObjectSize(oop(addr)->size()),
8079 "P-mark and computed size do not agree"); 8087 "P-mark and computed size do not agree");
8080 } 8088 }
8081 #endif 8089 #endif
8084 // This should be an initialized object that's alive. 8092 // This should be an initialized object that's alive.
8085 assert(oop(addr)->klass_or_null() != NULL && 8093 assert(oop(addr)->klass_or_null() != NULL &&
8086 (!_collector->should_unload_classes() 8094 (!_collector->should_unload_classes()
8087 || oop(addr)->is_parsable()), 8095 || oop(addr)->is_parsable()),
8088 "Should be an initialized object"); 8096 "Should be an initialized object");
8097 // Note that there are objects used during class redefinition
8098 // (e.g., merge_cp in VM_RedefineClasses::merge_cp_and_rewrite()
8099 // which are discarded with their is_conc_safe state still
8100 // false. These object may be floating garbage so may be
8101 // seen here. If they are floating garbage their size
8102 // should be attainable from their klass. Do not that
8103 // is_conc_safe() is true for oop(addr).
8089 // Ignore mark word because we are running concurrent with mutators 8104 // Ignore mark word because we are running concurrent with mutators
8090 assert(oop(addr)->is_oop(true), "live block should be an oop"); 8105 assert(oop(addr)->is_oop(true), "live block should be an oop");
8091 // Verify that the bit map has no bits marked between 8106 // Verify that the bit map has no bits marked between
8092 // addr and purported end of this block. 8107 // addr and purported end of this block.
8093 size = CompactibleFreeListSpace::adjustObjectSize(oop(addr)->size()); 8108 size = CompactibleFreeListSpace::adjustObjectSize(oop(addr)->size());