Why is there internal fragmentation in a Java object even if every field is 4-byte aligned?

后端 未结 2 1928
佛祖请我去吃肉
佛祖请我去吃肉 2021-01-02 17:50

Intro:

I used the JOL (Java Object Layout) tool to analyze the internal and external fragmentation of Java objects for research purpose.

Whi

2条回答
  •  再見小時候
    2021-01-02 18:11

    Sometimes HotSpot injects internal VM-specific fields that are not visible on Java level. In ClassLoader case this is a pointer to ClassLoaderData:

    #define CLASSLOADER_INJECTED_FIELDS(macro)                            \
      macro(java_lang_ClassLoader, loader_data,  intptr_signature, false)
    

    This is one field of intptr_t type, i.e. exactly 8 bytes long.

    Here is how HotSpot sources describe ClassLoaderData:

    // A ClassLoaderData identifies the full set of class types that a class
    // loader's name resolution strategy produces for a given configuration of the
    // class loader.
    // Class types in the ClassLoaderData may be defined by from class file binaries
    // provided by the class loader, or from other class loader it interacts with
    // according to its name resolution strategy.
    //
    // Class loaders that implement a deterministic name resolution strategy
    // (including with respect to their delegation behavior), such as the boot, the
    // extension, and the system loaders of the JDK's built-in class loader
    // hierarchy, always produce the same linkset for a given configuration.
    //
    // ClassLoaderData carries information related to a linkset (e.g.,
    // metaspace holding its klass definitions).
    // The System Dictionary and related data structures (e.g., placeholder table,
    // loader constraints table) as well as the runtime representation of classes
    // only reference ClassLoaderData.
    //
    // Instances of java.lang.ClassLoader holds a pointer to a ClassLoaderData that
    // that represent the loader's "linking domain" in the JVM.
    //
    // The bootstrap loader (represented by NULL) also has a ClassLoaderData,
    // the singleton class the_null_class_loader_data().
    

提交回复
热议问题