Kolejność pól

0

Chciałbym zapytać o kolejność pól w Javie. Zgodnie z artykułem [0], a konkretniej sekcją 'Object packing' kolejność pól będzie inna niż zadeklarowano w kodzie źródłowym, żeby nie marnować miejsca. Skompilowałem podany przykład i korzystając z programu javap spojrzałem na to co jest w środku (jdk 8u40) i kolejność została niezmieniona

  Last modified 2016-05-31; size 465 bytes
  MD5 checksum 3782544d5b42c7d920fd371ac77d4dc6
  Compiled from "StaticClass.java"
public class cybuch.StaticClass$Button
  minor version: 0
  major version: 52
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
   #1 = Methodref          #3.#22         // java/lang/Object."<init>":()V
   #2 = Class              #24            // cybuch/StaticClass$Button
   #3 = Class              #27            // java/lang/Object
   #4 = Utf8               shape
   #5 = Utf8               C
   #6 = Utf8               label
   #7 = Utf8               Ljava/lang/String;
   #8 = Utf8               xposition
   #9 = Utf8               I
  #10 = Utf8               yposition
  #11 = Utf8               color
  #12 = Utf8               joe
  #13 = Utf8               mike
  #14 = Utf8               Ljava/lang/Object;
  #15 = Utf8               armed
  #16 = Utf8               <init>
  #17 = Utf8               ()V
  #18 = Utf8               Code
  #19 = Utf8               LineNumberTable
  #20 = Utf8               SourceFile
  #21 = Utf8               StaticClass.java
  #22 = NameAndType        #16:#17        // "<init>":()V
  #23 = Class              #28            // cybuch/StaticClass
  #24 = Utf8               cybuch/StaticClass$Button
  #25 = Utf8               Button
  #26 = Utf8               InnerClasses
  #27 = Utf8               java/lang/Object
  #28 = Utf8               cybuch/StaticClass
{
  char shape;
    descriptor: C
    flags:

  java.lang.String label;
    descriptor: Ljava/lang/String;
    flags:

  int xposition;
    descriptor: I
    flags:

  int yposition;
    descriptor: I
    flags:

  char color;
    descriptor: C
    flags:

  int joe;
    descriptor: I
    flags:

  java.lang.Object mike;
    descriptor: Ljava/lang/Object;
    flags:

  char armed;
    descriptor: C
    flags:

  public cybuch.StaticClass$Button();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: return
      LineNumberTable:
        line 19: 0
}
SourceFile: "StaticClass.java"
InnerClasses:
     public static #25= #2 of #23; //Button=class cybuch/StaticClass$Button of class cybuch/Stati
cClass

To kiedy zostanie zmieniona kolejność (czy w ogóle i zawsze)? Jak klasa zostanie załadowana do VM (HotSpota)?

[0] http://www.oracle.com/technetwork/java/whitepaper-135217.html

1

Na oko ten paper mówi wyraźnie o maszynie wirtualnej a nie o kompilatorze, więc zgadywałbym że chodzi tutaj o runtime.

1

Plik class, a to jak klasa wygląda w VM-ce to dwie różne rzeczy. W trakcie ładownia klasy zostanie dokonana odpowiednia „magia”, o której pisze w papierze. Kolejność w pliku class jest determinowana przez działanie kompilatora i co do zasady będzie taka jak deklarowana (bo tak jest łatwiej). Skompiluj bez znaczników debugowania i zobacz jak będzie wtedy to wyglądać.

3

@Koziołek Twój kolega Thompson mówi że

the object fields are re-ordered from declaration order to the following order based on size in bytes:

doubles (8) and longs (8)
ints (4) and floats (4)
shorts (2) and chars (2)
booleans (1) and bytes (1)
references (4/8)

zresztą cały art se można przeczytać http://mechanical-sympathy.blogspot.co.il/2011/07/false-sharing.html

0
Koziołek napisał(a):

Plik class, a to jak klasa wygląda w VM-ce to dwie różne rzeczy. W trakcie ładownia klasy zostanie dokonana odpowiednia „magia”, o której pisze w papierze. Kolejność w pliku class jest determinowana przez działanie kompilatora i co do zasady będzie taka jak deklarowana (bo tak jest łatwiej). Skompiluj bez znaczników debugowania i zobacz jak będzie wtedy to wyglądać.

Wychodzi na to, że w czasie ładowania, po wyłączeniu flag debugowania kolejność pól pozostała taka sama.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.