Shenandoah: ShenandoahMaxRegionSize can produce an unaligned heap alignment

XMLWordPrintable

    • gc
    • b26

      While rewriting some of the heap size initialization code we hit a corner-case where the setting of ShenandoahMaxRegionSize to something that isn't a power-of-2 will hit an assert in `max_heap_for_compressed_oops`.

      When running with:
      java -XX:+UseShenandoahGC -XX:+UnlockExperimentalVMOptions -XX:ShenandoahMaxRegionSize=33m -version

       The following code:
      ```
        size_t displacement_due_to_null_page = align_up(os::vm_page_size(),
                                                        _conservative_max_heap_alignment)
      ```
      triggers:
      ```
      # assert(is_power_of_2(alignment)) failed: must be a power of 2: 34603008
      ```
      because `_conservative_max_heap_alignment` is not a power-of-2.

      This happens because Shenandoah's `conservative_max_heap_alignment()`
       returns a potentially unaligned `ShenandoahMaxRegionSize` value.

      ```
      size_t ShenandoahArguments::conservative_max_heap_alignment() {
        size_t align = ShenandoahMaxRegionSize;
        if (UseLargePages) {
          align = MAX2(align, os::large_page_size());
        }
        return align;
      }
      ```

      I propose a small fix to adjust `align` to be a power-of-2.

            Assignee:
            Stefan Karlsson
            Reporter:
            Stefan Karlsson
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

              Created:
              Updated:
              Resolved: