RFR: 8334220: Optimize Klass layout after JDK-8180450

Coleen Phillimore coleenp at openjdk.org
Tue Jul 2 15:02:18 UTC 2024


On Sat, 29 Jun 2024 19:58:23 GMT, Xiaolong Peng <xpeng at openjdk.org> wrote:

> Hi all, 
>     This PR is created to optimize the layout of Klass in hotspot, after JDK-8180450 the layout of Klsss seems broken, there are 3 holes, they are caused by alignment issue introduced by the 1 byte ```_hash_slot```. 
> 
> 
> (gdb) ptype /ox Klass
> /* offset      |    size */  type = class Klass : public Metadata {
>                              public:
>                                static const uint KLASS_KIND_COUNT;
>                              protected:
> /* 0x000c      |  0x0004 */    jint _layout_helper;
> /* 0x0010      |  0x0004 */    const enum Klass::KlassKind _kind;
> /* 0x0014      |  0x0004 */    jint _modifier_flags;
> /* 0x0018      |  0x0004 */    juint _super_check_offset;
> /* XXX  4-byte hole      */
> /* 0x0020      |  0x0008 */    class Symbol *_name;
> /* 0x0028      |  0x0008 */    class Klass *_secondary_super_cache;
> /* 0x0030      |  0x0008 */    class Array<Klass*> *_secondary_supers;
> /* 0x0038      |  0x0040 */    class Klass *_primary_supers[8];
> /* 0x0078      |  0x0008 */    class OopHandle {
>                                  private:
> /* 0x0078      |  0x0008 */        class oop *_obj;
> 
>                                    /* total size (bytes):    8 */
>                                } _java_mirror;
> /* 0x0080      |  0x0008 */    class Klass *_super;
> /* 0x0088      |  0x0008 */    class Klass * volatile _subklass;
> /* 0x0090      |  0x0008 */    class Klass * volatile _next_sibling;
> /* 0x0098      |  0x0008 */    class Klass *_next_link;
> /* 0x00a0      |  0x0008 */    class ClassLoaderData *_class_loader_data;
> /* 0x00a8      |  0x0008 */    uintx _bitmap;
> /* 0x00b0      |  0x0001 */    uint8_t _hash_slot;
> /* XXX  3-byte hole      */
> /* 0x00b4      |  0x0004 */    int _vtable_len;
> /* 0x00b8      |  0x0004 */    class AccessFlags {
>                                  private:
> /* 0x00b8      |  0x0004 */        jint _flags;
> 
>                                    /* total size (bytes):    4 */
>                                } _access_flags;
> /* XXX  4-byte hole      */
> /* 0x00c0      |  0x0008 */    traceid _trace_id;
>                              private:
> /* 0x00c8      |  0x0002 */    s2 _shared_class_path_index;
> /* 0x00ca      |  0x0002 */    u2 _shared_class_flags;
> /* 0x00cc      |  0x0004 */    int _archived_mirror_index;
>                              public:
>                                static const int SECONDARY_SUPERS_TABLE_SIZE;
>                                static const int SECONDARY_SUPERS_TABLE_MASK;
>                                static const...

I have a couple of questions about this and a request.  Thanks.

src/hotspot/share/oops/klass.hpp line 166:

> 164:   uintx    _bitmap;
> 165: 
> 166:   static uint8_t compute_hash_slot(Symbol* s);

We don't usually put functions in with nonstatic member declarations.  Since you moved hash_slot, can you move this function to the first private section where hash_insert is?

Where you moved hash_slot looks fine.  Doesn't look like it will have negative cache effects, unless it needs to be on a cache line with _bitmap?

src/hotspot/share/oops/klass.hpp line 176:

> 174:   JFR_ONLY(DEFINE_TRACE_ID_FIELD;)
> 175:   uint8_t  _hash_slot;
> 176:   DEFINE_PAD_MINUS_SIZE(1, 4, sizeof(uint8_t)); //3 bytes padding after 1 byte _hash_slot for better layout

How does this help? Doesn't the compiler add this padding?

-------------

Changes requested by coleenp (Reviewer).

PR Review: https://git.openjdk.org/jdk/pull/19958#pullrequestreview-2154109976
PR Review Comment: https://git.openjdk.org/jdk/pull/19958#discussion_r1662698438
PR Review Comment: https://git.openjdk.org/jdk/pull/19958#discussion_r1662701347


More information about the hotspot-dev mailing list