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

jcmd GC.heap_dump performance regression after JDK-8292818

    XMLWordPrintable

Details

    • b15
    • 21
    • b21

    Backports

      Description

        JDK-8292818 changed how field metadata (e.g. access flags) is accessed to streaming access. That means accessing a field of a InstanceKlass by index has to go through the stream to find the appropriate field.

        This causes a performance regression in jcmd GC.heap_dump, which uses FieldStream from reflectionUtils.hpp. This implementation has two flaws in combination with the change from JDK-8292818:

        1. It uses field indexes to access data, e.g. _klass->field_access_flags(_index) to get a field's access flags.
        2. It traverses the fields in reverse order. The way how the metadata is stored now only allows for efficient forward traversal.

        As an example, running the attached Java file and creating a heap dump takes (on my machine):
        - 2-3 seconds on Java 17
        - ~20 seconds on Java 21

        FieldStream cannot directly be replaced by the implementations from fieldStreams.hpp because it additionally traverses supertypes.

        The proposed fix is to add field streaming with supertype traversal to fieldStreams.hpp. This way, other usages of FIeldStream are unaffected in behavior. The new implementation does foward traversal over the fields but keeps the order in which supertypes visited from FieldStream. This way, the produced heap dump will still conform to the hprof format.

        Relevant mailing list discussion: https://mail.openjdk.org/pipermail/serviceability-dev/2023-October/051571.html

        Attachments

          Issue Links

            Activity

              People

                hgreule Hannes Greule
                hgreule Hannes Greule
                Votes:
                0 Vote for this issue
                Watchers:
                8 Start watching this issue

                Dates

                  Created:
                  Updated:
                  Resolved: