99 // Ensure the object fit in the current region. 100 while (!object_will_fit(size)) { 101 switch_region(); 102 } 103 104 // Store a forwarding pointer if the object should be moved. 105 if ((HeapWord*)object != _compaction_top) { 106 object->forward_to(oop(_compaction_top)); 107 } else { 108 if (object->forwardee() != NULL) { 109 // Object should not move but mark-word is used so it looks like the 110 // object is forwarded. Need to clear the mark and it's no problem 111 // since it will be restored by preserved marks. There is an exception 112 // with BiasedLocking, in this case forwardee() will return NULL 113 // even if the mark-word is used. This is no problem since 114 // forwardee() will return NULL in the compaction phase as well. 115 object->init_mark_raw(); 116 } else { 117 // Make sure object has the correct mark-word set or that it will be 118 // fixed when restoring the preserved marks. 119 assert(object->mark_raw() == markWord::prototype_for_object(object) || // Correct mark 120 object->mark_raw().must_be_preserved(object) || // Will be restored by PreservedMarksSet 121 (UseBiasedLocking && object->has_bias_pattern_raw()), // Will be restored by BiasedLocking 122 "should have correct prototype obj: " PTR_FORMAT " mark: " PTR_FORMAT " prototype: " PTR_FORMAT, 123 p2i(object), object->mark_raw().value(), markWord::prototype_for_object(object).value()); 124 } 125 assert(object->forwardee() == NULL, "should be forwarded to NULL"); 126 } 127 128 // Update compaction values. 129 _compaction_top += size; 130 if (_compaction_top > _threshold) { 131 _threshold = _current_region->cross_threshold(_compaction_top - size, _compaction_top); 132 } 133 } 134 135 void G1FullGCCompactionPoint::add(HeapRegion* hr) { 136 _compaction_regions->append(hr); 137 } 138 139 void G1FullGCCompactionPoint::merge(G1FullGCCompactionPoint* other) { 140 _compaction_regions->appendAll(other->regions()); 141 } 142 143 HeapRegion* G1FullGCCompactionPoint::remove_last() { | 99 // Ensure the object fit in the current region. 100 while (!object_will_fit(size)) { 101 switch_region(); 102 } 103 104 // Store a forwarding pointer if the object should be moved. 105 if ((HeapWord*)object != _compaction_top) { 106 object->forward_to(oop(_compaction_top)); 107 } else { 108 if (object->forwardee() != NULL) { 109 // Object should not move but mark-word is used so it looks like the 110 // object is forwarded. Need to clear the mark and it's no problem 111 // since it will be restored by preserved marks. There is an exception 112 // with BiasedLocking, in this case forwardee() will return NULL 113 // even if the mark-word is used. This is no problem since 114 // forwardee() will return NULL in the compaction phase as well. 115 object->init_mark_raw(); 116 } else { 117 // Make sure object has the correct mark-word set or that it will be 118 // fixed when restoring the preserved marks. 119 assert(object->mark_raw() == markWord::prototype_for_klass(object->klass()) || // Correct mark 120 object->mark_must_be_preserved() || // Will be restored by PreservedMarksSet 121 (UseBiasedLocking && object->has_bias_pattern_raw()), // Will be restored by BiasedLocking 122 "should have correct prototype obj: " PTR_FORMAT " mark: " PTR_FORMAT " prototype: " PTR_FORMAT, 123 p2i(object), object->mark_raw().value(), markWord::prototype_for_klass(object->klass()).value()); 124 } 125 assert(object->forwardee() == NULL, "should be forwarded to NULL"); 126 } 127 128 // Update compaction values. 129 _compaction_top += size; 130 if (_compaction_top > _threshold) { 131 _threshold = _current_region->cross_threshold(_compaction_top - size, _compaction_top); 132 } 133 } 134 135 void G1FullGCCompactionPoint::add(HeapRegion* hr) { 136 _compaction_regions->append(hr); 137 } 138 139 void G1FullGCCompactionPoint::merge(G1FullGCCompactionPoint* other) { 140 _compaction_regions->appendAll(other->regions()); 141 } 142 143 HeapRegion* G1FullGCCompactionPoint::remove_last() { |