Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8280761

UseCompressedOops should be set after limit_heap_by_allocatable_memory

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Fixed
    • Icon: P4 P4
    • 19
    • 19
    • hotspot
    • gc
    • b19

      "ulimit -v" can limit the amount of virtual memory available to the JVM. Therefore, Arguments::set_heap_size() calls limit_heap_by_allocatable_memory() to reduce the max heap size to respect this limit.

      https://github.com/iklam/jdk/blame/a4d201909c8919b7465dee72594d718252c6344e/src/hotspot/share/runtime/arguments.cpp#L1755

      However, UseCompressedOops is set before limit_heap_by_allocatable_memory(). As a result, even if the final heap size is small enough, the JVM will still disable UseCompressedOops, and thus use more memory for oop pointers than necesary.

      In the following two test cases, the ergonomics code choose the same max heap size (5121245184), but UseCompressedOops is disabled in the second case.

      ~$ (ulimit -v 10000000; java -Xlog:gc*=debug -XX:MaxRAM=32g -version) 2>&1 | egrep '(Compressed Oops:)|(Maximum)'
      [0.023s][debug][gc,heap] Minimum heap 8388608 Initial heap 536870912 Maximum heap 5121245184
      [0.027s][info ][gc,init ] Compressed Oops: Enabled (Zero based)

      ~$ (ulimit -v 10000000; java -Xlog:gc*=debug -XX:MaxRAM=128g -version) 2>&1 | egrep '(Compressed Oops:)|(Maximum)'
      [0.021s][debug][gc,heap] Minimum heap 8388608 Initial heap 2147483648 Maximum heap 5121245184
      [0.028s][info ][gc,init ] Compressed Oops: Disabled

            ayang Albert Yang
            iklam Ioi Lam
            Votes:
            0 Vote for this issue
            Watchers:
            4 Start watching this issue

              Created:
              Updated:
              Resolved: