changeset 3985:c63b928b212b

7021322: assert(object_end <= top()) failed: Object crosses promotion LAB boundary Summary: Pass the same object size value to both allocate and unallocate_object Reviewed-by: ysr, brutisso
author stefank
date Mon, 12 Sep 2011 16:09:50 +0200
parents 81aa07130d30
children 65a8ff39a6da
files src/share/vm/gc_implementation/parallelScavenge/psPromotionLAB.cpp src/share/vm/gc_implementation/parallelScavenge/psPromotionLAB.hpp src/share/vm/gc_implementation/parallelScavenge/psPromotionManager.cpp
diffstat 3 files changed, 8 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/vm/gc_implementation/parallelScavenge/psPromotionLAB.cpp	Mon Oct 03 19:04:14 2011 -0400
+++ b/src/share/vm/gc_implementation/parallelScavenge/psPromotionLAB.cpp	Mon Sep 12 16:09:50 2011 +0200
@@ -102,17 +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();
-    assert(object_end <= top(), "Object crosses promotion LAB boundary");
+    HeapWord* object_end = obj + obj_size;
+    assert(object_end == top(), "Not matching last allocation");
 
-    if (object_end == top()) {
-      set_top((HeapWord*)obj);
-      return true;
-    }
+    set_top(obj);
+    return true;
   }
 
   return false;
--- a/src/share/vm/gc_implementation/parallelScavenge/psPromotionLAB.hpp	Mon Oct 03 19:04:14 2011 -0400
+++ b/src/share/vm/gc_implementation/parallelScavenge/psPromotionLAB.hpp	Mon Sep 12 16:09:50 2011 +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()); }
--- a/src/share/vm/gc_implementation/parallelScavenge/psPromotionManager.cpp	Mon Oct 03 19:04:14 2011 -0400
+++ b/src/share/vm/gc_implementation/parallelScavenge/psPromotionManager.cpp	Mon Sep 12 16:09:50 2011 +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);
       }