< prev index next >

src/hotspot/share/gc/z/zRelocate.cpp

Print this page

 589   void set_target(ZPageAge age, ZPage* page) {
 590     _target[static_cast<uint>(age) - 1] = page;
 591   }
 592 
 593   size_t object_alignment() const {
 594     return (size_t)1 << _forwarding->object_alignment_shift();
 595   }
 596 
 597   void increase_other_forwarded(size_t unaligned_object_size) {
 598     const size_t aligned_size = align_up(unaligned_object_size, object_alignment());
 599     if (_forwarding->is_promotion()) {
 600       _other_promoted += aligned_size;
 601     } else {
 602       _other_compacted += aligned_size;
 603     }
 604   }
 605 
 606   zaddress try_relocate_object_inner(zaddress from_addr) {
 607     ZForwardingCursor cursor;
 608 
 609     const size_t size = ZUtils::object_size(from_addr);
 610     ZPage* const to_page = target(_forwarding->to_age());
 611 
 612     // Lookup forwarding
 613     {
 614       const zaddress to_addr = forwarding_find(_forwarding, from_addr, &cursor);
 615       if (!is_null(to_addr)) {
 616         // Already relocated

 617         increase_other_forwarded(size);
 618         return to_addr;
 619       }
 620     }
 621 
 622     // Allocate object

 623     const zaddress allocated_addr = _allocator->alloc_object(to_page, size);
 624     if (is_null(allocated_addr)) {
 625       // Allocation failed
 626       return zaddress::null;
 627     }
 628 
 629     // Copy object. Use conjoint copying if we are relocating
 630     // in-place and the new object overlaps with the old object.
 631     if (_forwarding->in_place_relocation() && allocated_addr + size > from_addr) {
 632       ZUtils::object_copy_conjoint(from_addr, allocated_addr, size);
 633     } else {
 634       ZUtils::object_copy_disjoint(from_addr, allocated_addr, size);
 635     }
 636 
 637     // Insert forwarding
 638     const zaddress to_addr = forwarding_insert(_forwarding, from_addr, allocated_addr, &cursor);
 639     if (to_addr != allocated_addr) {
 640       // Already relocated, undo allocation
 641       _allocator->undo_alloc_object(to_page, to_addr, size);
 642       increase_other_forwarded(size);

 589   void set_target(ZPageAge age, ZPage* page) {
 590     _target[static_cast<uint>(age) - 1] = page;
 591   }
 592 
 593   size_t object_alignment() const {
 594     return (size_t)1 << _forwarding->object_alignment_shift();
 595   }
 596 
 597   void increase_other_forwarded(size_t unaligned_object_size) {
 598     const size_t aligned_size = align_up(unaligned_object_size, object_alignment());
 599     if (_forwarding->is_promotion()) {
 600       _other_promoted += aligned_size;
 601     } else {
 602       _other_compacted += aligned_size;
 603     }
 604   }
 605 
 606   zaddress try_relocate_object_inner(zaddress from_addr) {
 607     ZForwardingCursor cursor;
 608 

 609     ZPage* const to_page = target(_forwarding->to_age());
 610 
 611     // Lookup forwarding
 612     {
 613       const zaddress to_addr = forwarding_find(_forwarding, from_addr, &cursor);
 614       if (!is_null(to_addr)) {
 615         // Already relocated
 616         const size_t size = ZUtils::object_size(to_addr);
 617         increase_other_forwarded(size);
 618         return to_addr;
 619       }
 620     }
 621 
 622     // Allocate object
 623     const size_t size = ZUtils::object_size(from_addr);
 624     const zaddress allocated_addr = _allocator->alloc_object(to_page, size);
 625     if (is_null(allocated_addr)) {
 626       // Allocation failed
 627       return zaddress::null;
 628     }
 629 
 630     // Copy object. Use conjoint copying if we are relocating
 631     // in-place and the new object overlaps with the old object.
 632     if (_forwarding->in_place_relocation() && allocated_addr + size > from_addr) {
 633       ZUtils::object_copy_conjoint(from_addr, allocated_addr, size);
 634     } else {
 635       ZUtils::object_copy_disjoint(from_addr, allocated_addr, size);
 636     }
 637 
 638     // Insert forwarding
 639     const zaddress to_addr = forwarding_insert(_forwarding, from_addr, allocated_addr, &cursor);
 640     if (to_addr != allocated_addr) {
 641       // Already relocated, undo allocation
 642       _allocator->undo_alloc_object(to_page, to_addr, size);
 643       increase_other_forwarded(size);
< prev index next >