--- old/src/share/vm/gc_implementation/parallelScavenge/psPromotionLAB.cpp 2011-09-12 16:10:55.000000000 +0200 +++ new/src/share/vm/gc_implementation/parallelScavenge/psPromotionLAB.cpp 2011-09-12 16:10:55.000000000 +0200 @@ -102,15 +102,15 @@ _state = flushed; } -bool PSPromotionLAB::unallocate_object(oop obj) { +bool PSPromotionLAB::unallocate_object(HeapWord* obj, size_t obj_size) { assert(Universe::heap()->is_in(obj), "Object outside heap"); if (contains(obj)) { - HeapWord* object_end = (HeapWord*)obj + obj->size(); + HeapWord* object_end = obj + obj_size; assert(object_end <= top(), "Object crosses promotion LAB boundary"); if (object_end == top()) { - set_top((HeapWord*)obj); + set_top(obj); return true; } } --- old/src/share/vm/gc_implementation/parallelScavenge/psPromotionLAB.hpp 2011-09-12 16:10:55.000000000 +0200 +++ new/src/share/vm/gc_implementation/parallelScavenge/psPromotionLAB.hpp 2011-09-12 16:10:55.000000000 +0200 @@ -73,7 +73,7 @@ bool is_flushed() { return _state == flushed; } - bool unallocate_object(oop obj); + bool unallocate_object(HeapWord* obj, size_t obj_size); // Returns a subregion containing all objects in this space. MemRegion used_region() { return MemRegion(bottom(), top()); } --- old/src/share/vm/gc_implementation/parallelScavenge/psPromotionManager.cpp 2011-09-12 16:10:56.000000000 +0200 +++ new/src/share/vm/gc_implementation/parallelScavenge/psPromotionManager.cpp 2011-09-12 16:10:56.000000000 +0200 @@ -380,10 +380,10 @@ // deallocate it, so we have to test. If the deallocation fails, // overwrite with a filler object. if (new_obj_is_tenured) { - if (!_old_lab.unallocate_object(new_obj)) { + if (!_old_lab.unallocate_object((HeapWord*) new_obj, new_obj_size)) { CollectedHeap::fill_with_object((HeapWord*) new_obj, new_obj_size); } - } else if (!_young_lab.unallocate_object(new_obj)) { + } else if (!_young_lab.unallocate_object((HeapWord*) new_obj, new_obj_size)) { CollectedHeap::fill_with_object((HeapWord*) new_obj, new_obj_size); }