рдЬрд╛рд╡рд╛ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрдХрд╛рд░

рдкрд░рд┐рдЪрдп


рдХреНрдпрд╛ рдЬрд╛рд╡рд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИ:

  • рд╕реБрдкрд░рдХреНрд▓рд╛рд╕ рдореЗрдВ рдШреЛрд╖рд┐рдд рдХреНрд╖реЗрддреНрд░?
  • рд╕реБрдкрд░рдХреНрд▓рд╛рд╕ рдореЗрдВ рдШреЛрд╖рд┐рдд рдирд┐рдЬреА рдХреНрд╖реЗрддреНрд░?
  • рддрд░реАрдХреЛрдВ?
  • рд╕рд░рдгреА рддрддреНрд╡?
  • рд╕рд░рдгреА рдХреА рд▓рдВрдмрд╛рдИ?
  • рдПрдХ рдФрд░ рд╡рд╕реНрддреБ (рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ)?
  • рд╣реИрд╢ рдХреЛрдб?
  • рдкреНрд░рдХрд╛рд░ (рдЕрдкрдиреЗ)?
  • рдирд╛рдо (рдЕрдкрдирд╛)?

рдЗрди (рдФрд░ рдЕрдиреНрдп) рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рдЬрд╡рд╛рдм рдХрдХреНрд╖рд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп org.openjdk.jol рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд╣рдореЗрдВ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдПрдХ рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░ рд╣реИ:

  • рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
    • рд╢реАрд░реНрд╖ рд▓реЗрдЦ (16 рдмрд╛рдЗрдЯ рддрдХ), рдФрд░ рдЗрд╕рдореЗрдВ:
      • рд╣реИрд╢ рдХреЛрдб
      • рд╕рдВрджрд░реНрдн рд▓рд┐рдЦреЗрдВ
      • рд╕рд░рдгреА рд▓рдВрдмрд╛рдИ (рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП)
    • рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ (рдирд┐рдЬреА рд╕рд╣рд┐рдд) рд╕рднреА рд╕реБрдкрд░рдХреНрд▓рд╛рд╕ рдореЗрдВ рдШреЛрд╖рд┐рдд
    • рдпрд╛ рд╕рд░рдгреА рддрддреНрд╡ (рдПрдХ рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП)
  • рдпреБрдХреНрдд рдирд╣реАрдВ:
    • рд╕реНрдерд┐рд░ рдЪрд░
    • рддрд░реАрдХреЛрдВ
    • рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдЕрдиреНрдп рд╡рд╕реНрддреБрдУрдВ
    • рд╕реНрд╡рдпрдВ рдХрд╛ рдирд╛рдо (рдЕрд░реНрдерд╛рдд, рд╡рд╕реНрддреБ рдХрд╛ рдХреЛрдИ рдирд╛рдо рдирд╣реАрдВ рд╣реИ)


рдЯреНрд░реЗрдирд┐рдВрдЧ


рдпрд╣рд╛рдБ java.lang.instrument рдкреИрдХреЗрдЬ рдХреЗ рд╡рд┐рд╡рд░рдг рд╕реЗ рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕реНрдореГрддрд┐ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдо рд╣реИрдВред рдпреЗ рдкрд░рд┐рдгрд╛рдо рд╣рдореЗрдВ рдКрдкрд░ рджрд┐рдП рдЧрдП рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЪрд░рдгреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:

  1. рдкреНрд░реАрдорд┐рдпрд░ рд╡рд┐рдзрд┐ рдпреБрдХреНрдд рдПрдХ рдПрдЬреЗрдВрдЯ рд╡рд░реНрдЧ рдмрдирд╛рдПрдБ:
    public static void premain(String, Instrumentation) {...} 
  2. рдПрдЬреЗрдВрдЯ рд╡рд░реНрдЧ рдФрд░ рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдкреНрд░рдХрдЯ рдлрд╝рд╛рдЗрд▓ рдпреБрдХреНрдд рдПрдХ рд╕рдВрдЧреНрд░рд╣ рдмрдирд╛рдПрдБ:
     Premain-class: -- 
  3. рдореЗрдореЛрд░реА рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рд╡рд░реНрдЧ рдмрдирд╛рдПрдВред
  4. рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рд╢реБрд░реВ рдХрд░рддреЗ рд╕рдордп "-javaagent" рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рд╕рдВрдЧреНрд░рд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ:
     java -javaagent:- -- 


рдЪрд▓реЛ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП рд╣рдо рдПрдХ рдЕрдирд╛рдо рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рдЪрд░рдг 1. рдПрдХ рдкрд░реАрдХреНрд╖рдг рдПрдЬреЗрдВрдЯ рд╡рд░реНрдЧ рдмрдирд╛рдПрдБ


 import java.lang.instrument.Instrumentation; public class A { public static void premain(String notUsedHere, Instrumentation i) { System.out.println("premain"); } } 

рд╣рдо рд╕рдВрдХрд▓рди рдХрд░рддреЗ рд╣реИрдВ:

 javac A.java 

рдЪрд░рдг 2. рдПрдХ m.txt рдореЗрдирд┐рдлрд╝реЗрд╕реНрдЯ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ:


 Premain-class: A   

рдзреНрдпрд╛рди рджреЗрдВ: рдлрд╝рд╛рдЗрд▓ рдХреА рджреВрд╕рд░реА рдкрдВрдХреНрддрд┐ EMPTY рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рдореЗрдВ SPACES рдирд╣реАрдВ рд╣реЛред

A. рдПрдЬрд╝рд░ рд╕рдВрдЧреНрд░рд╣ рдмрдирд╛рдПрдБ:

 jar cmf m.txt A.jar A.class 

рдЪрд░рдг 3. рдПрдХ рдкрд░реАрдХреНрд╖рдг рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рд╡рд░реНрдЧ рдмрдирд╛рдПрдВ


 public class M { public static void main(String[] notUsedHere) { //     System.out.println("main"); } } 

рд╣рдо рд╕рдВрдХрд▓рди рдХрд░рддреЗ рд╣реИрдВ:

 javac M.java 

рдЪрд░рдг 4. рдкреНрд░рджрд░реНрд╢рди


 java -javaagent:A.jar M 

рдкрд░рд┐рдгрд╛рдо:
 premain main 

рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдПрдЬреЗрдВрдЯ рд╡рд░реНрдЧ рдХрд╛ рдореБрдЦреНрдп рддрд░реАрдХрд╛ рдкрд╣рд▓реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рдерд╛, рдФрд░ рдлрд┐рд░ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рд╡рд░реНрдЧ рдХреА рдореБрдЦреНрдп рд╡рд┐рдзрд┐ред

рдЕрдм рдЖрд╡рд╢реНрдпрдХ рдПрдЬреЗрдВрдЯ рд╡рд░реНрдЧ рдмрдирд╛рдПрдБ:

 import java.lang.instrument.Instrumentation; public class A { //      private static Instrumentation ins; public static void premain(String notUsedHere, Instrumentation i) { ins = i; } public static Instrumentation instrumentation() {return ins;} } 

рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рд╡рд░реНрдЧ:

 class M { public static void main(String[] notUsedHere) { mem("Object", new Object()); } private static void mem(Object o, Object ref) { System.out.println(o + ": " + objectBytesEstimate(ref)); } private static long objectBytesEstimate(Object ref) { if (A.instrumentation() == null) { throw new RuntimeException("Not initialized instrumentation."); } return A.instrumentation().getObjectSize(ref); } } 

рд╡рд┐рдзрд┐

 long getObjectSize(Object --) 

рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд▓рд┐рдВрдХ рдкрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рджреНрд╡рд╛рд░рд╛ рдХрдмреНрдЬрд╛ рдХреА рдЧрдИ рдореЗрдореЛрд░реА рдХреЗ рдЖрдХрд╛рд░ (рдмрд╛рдЗрдЯреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛) рдХрд╛ рдПрдХ рд╡рд░реНрдЧреАрдХрд░рдгред рдпрд╣ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдкрд░рд┐рдгрд╛рдореА рдЕрдиреБрдорд╛рди рдХрд┐рд╕реА рдЕрдиреНрдп рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдХреЗ рд▓рд┐рдП рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред Jdk-13 рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдпрд╣рд╛рдВ рд╕реВрдЪреАрдмрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рд╣рдо рдмрд╛рд╣рд░ рд▓реЗ:

 javac *.java jar cmf m.txt A.jar A.class java -javaagent:A.jar M 

рдФрд░ рд╣рдореЗрдВ рдЗрд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рддрд╛ рд╣реИ:

 Object: 16 

рдпрд╣ рджрд┐рдЦрд╛рддреЗ рд╣реБрдП рдХрд┐ рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБ рдХрд╛ рдПрдХ EMPTY рдСрдмреНрдЬреЗрдХреНрдЯ рдпрд╣рд╛рдВ рд░рд╣рддрд╛ рд╣реИ (BY ASSESSMENT) 16 рдмрд╛рдЗрдЯреНрд╕ред рдЗрдирдореЗрдВ рд╕реЗ, 12 рдмрд╛рдЗрдЯреНрд╕ рд╣реЗрдбрд░ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░ рд▓реЗрддреЗ рд╣реИрдВ, рдФрд░ рдЕрдВрдд рдореЗрдВ 4 рдмрд╛рдЗрдЯреНрд╕ 8 рдмрд╛рдЗрдЯреНрд╕ рдХреА рд╕реАрдорд╛ рддрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд▓рдВрдмрд╛рдИ рдХреЛ рд╕рдВрд░реЗрдЦрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВред

рдкрд░рд┐рдгрд╛рдо


рдЖрдЧреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдХреЗрд╡рд▓ рдХрдХреНрд╖рд╛ рдПрдо рдХреА рдореБрдЦреНрдп рд╡рд┐рдзрд┐ рдореЗрдВ рд░рдЦрд╛ рдХреЛрдб рд╣реЛрдЧрд╛ред рдЙрдиреНрд╣реЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:

 javac M.java java -javaagent:A.jar M 

рдП-рд░реЗрдЬрд╝рд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЦреЗрддреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдордирдорд╛рдиреЗ рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБ рдХреЗ рд╕реНрдореГрддрд┐ рдЖрдХрд╛рд░ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдХреЛрдб рдХреЛ рдореБрдЦреНрдп рд╡рд┐рдзрд┐ рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВ:

 class C {}; mem("Empty", new C()); // Empty: 16 

рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рд╕рдВрдХреЗрддрд┐рдд рдкрд░рд┐рдгрд╛рдо рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдЦреЗрддреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рд╡рд╕реНрддреБ рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБ рдХреЗ рд░реВрдк рдореЗрдВ рдХрдИ рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рд░рд╣рддреА рд╣реИред

рдЖрдЧреЗ, рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдкрд░рд┐рдгрд╛рдо:

 {class C {int a; } mem(1, new C());} // 1: 16 {class C {int a,b; } mem(2, new C());} // 2: 24 {class C {int a,b,c; } mem(3, new C());} // 3: 24 {class C {int a,b,c,d;} mem(4, new C());} // 4: 32 

рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЗрдВрдЯ рдлрд╝реАрд▓реНрдб 4 рдмрд╛рдЗрдЯреНрд╕ рд▓реЗрддрд╛ рд╣реИред рдореИрдВ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣рд╛рдВ рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдПрдХ рдЕрд▓рдЧ рдмреНрд▓реЙрдХ рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рд╡рд┐рднрд┐рдиреНрди рд╡рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдкреНрд░рддреНрдпреЗрдХ рд▓рдВрдмрд╛ рдХреНрд╖реЗрддреНрд░ 8 рдмрд╛рдЗрдЯреНрд╕ рд╣реИ:

 {class C {long a; } mem(1, new C());} // 1: 24 {class C {long a,b; } mem(2, new C());} // 2: 32 {class C {long a,b,c;} mem(3, new C());} // 3: 40 

рдкреНрд░рддреНрдпреЗрдХ рдмреВрд▓рд┐рдпрди рдлрд╝реАрд▓реНрдб рдореЗрдВ 1 рдмрд╛рдЗрдЯ рд▓рдЧрддреА рд╣реИ (рдЗрд╕ рд╡реАрдПрдо рдХреЗ рд▓рд┐рдП):

 {class C {boolean a; } mem(1, new C());} // 1: 16 {class C {boolean a,b; } mem(2, new C());} // 2: 16 {class C {boolean a,b,c; } mem(3, new C());} // 3: 16 {class C {boolean a,b,c,d; } mem(4, new C());} // 4: 16 {class C {boolean a,b,c,d,e;} mem(5, new C());} // 5: 24 

рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрджрд░реНрдн рдлрд╝реАрд▓реНрдб рдореЗрдВ 4 рдмрд╛рдЗрдЯреНрд╕ рд╣реЛрддреЗ рд╣реИрдВ (рдЗрд╕ VM рдХреЗ рд▓рд┐рдП):

 {class C {Boolean a; } mem(1, new C());} // 1: 16 {class C {Integer a; } mem(1, new C());} // 1: 16 {class C {Long a; } mem(1, new C());} // 1: 16 {class C {C a; } mem(1, new C());} // 1: 16 {class C {Boolean a,b; } mem(2, new C());} // 2: 24 {class C {Integer a,b; } mem(2, new C());} // 2: 24 {class C {Long a,b; } mem(2, new C());} // 2: 24 {class C {C a,b; } mem(2, new C());} // 2: 24 {class C {Boolean a,b,c; } mem(3, new C());} // 3: 24 {class C {Integer a,b,c; } mem(3, new C());} // 3: 24 {class C {Long a,b,c; } mem(3, new C());} // 3: 24 {class C {C a,b,c; } mem(3, new C());} // 3: 24 {class C {Boolean a,b,c,d;} mem(4, new C());} // 4: 32 {class C {Integer a,b,c,d;} mem(4, new C());} // 4: 32 {class C {Long a,b,c,d;} mem(4, new C());} // 4: 32 {class C {C a,b,c,d;} mem(4, new C());} // 4: 32 

рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ-рдкреНрд░рдХрд╛рд░ рдлрд╝реАрд▓реНрдб рднреА рд╣рд░ рд╕рдВрджрд░реНрдн рдХреА рддрд░рд╣ 4 рдмрд╛рдЗрдЯреНрд╕ рд▓реЗрддрд╛ рд╣реИ:

 {class C {String a; } mem(" null", new C());} // null: 16 {class C {String a=""; } mem(" empty", new C());} // empty: 16 {class C {String a="A"; } mem("1-char", new C());} // 1-char: 16 {class C {String a="1234567";} mem("7-char", new C());} // 7-char: 16 

рдПрдХ рд╕рд░рдгреА рд╕рдВрджрд░реНрдн рдлрд╝реАрд▓реНрдб рднреА 4 рдмрд╛рдЗрдЯреНрд╕ рд▓реЗрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рд╣рд░ рд╕рдВрджрд░реНрдн рдПрдХ:

 {class C {int[] a; } mem("null", new C());} // null: 16 {class C {int[] a = {}; } mem(" 0", new C());} // 0: 16 {class C {int[] a = new int[1]; } mem(" 1", new C());} // 1: 16 {class C {int[] a = new int[7]; } mem(" 7", new C());} // 7: 16 {class C {int[][] a = {}; } mem(" 00", new C());} // 00: 16 {class C {int[][] a = new int[1][1];} mem(" 11", new C());} // 11: 16 {class C {int[][] a = new int[7][7];} mem(" 77", new C());} // 77: 16 

рдЙрдкрдкреНрд░рдХрд╛рд░ рд╡рд╕реНрддреБ рдореЗрдВ рд╕реБрдкрд░рдХреНрд▓рд╛рд╕ рдореЗрдВ рдШреЛрд╖рд┐рдд рдкреНрд░рддреНрдпреЗрдХ рдХреНрд╖реЗрддреНрд░ рд╢рд╛рдорд┐рд▓ рд╣реИ, рднрд▓реЗ рд╣реА рдкрд╣реБрдВрдЪ рд╕рдВрд╢реЛрдзрдХ:

 {class S { } class C extends S {long a;} mem("0+1", new C());} // 0+1: 24 {class S {private long a;} class C extends S { } mem("1+0", new C());} // 1+0: 24 

рдЙрдк-рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБ рдореЗрдВ рд╕реБрдкрд░рдХреНрд▓рд╛рд╕ рдореЗрдВ рдЙрд╕реА рдирд╛рдо рд╕реЗ рдШреЛрд╖рд┐рдд рдПрдХ рдХреНрд╖реЗрддреНрд░ рд╣реЛрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдЙрдк-рд╡рд░реНрдЧ рдореЗрдВ (рддрдерд╛рдХрдерд┐рдд - рдЫрд┐рдкрд╛ рд╣реБрдЖ):

 {class S { } class C extends S {long a,b;} mem("0+2", new C());} // 0+2: 32 {class S {long a;} class C extends S {long a; } mem("1+1", new C());} // 1+1: 32 

рдПрдХ рдЙрдкрдкреНрд░рдХрд╛рд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╕реБрдкрд░рдХреНрд▓рд╛рд╕реЗрд╕ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 class U {private long a; } class S extends U {private long a; } class C extends S { long a; } mem("1+1+1", new C()); // 1+1+1: 40 class D { long a,b,c;} mem("0+0+3", new D()); // 0+0+3: 40 

рд╕рд░рдгрд┐рдпреЛрдВ рдХреА рдУрд░ рдореБрдбрд╝реЗрдВред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рдПрдХ рд╕рд░рдгреА рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБ рд╣реИ рдЬрд┐рд╕рдХреЗ рддрддреНрд╡ рд╕реНрд╡рдпрдВ рдореЗрдВ рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╕рд░рдгреА рджреНрд╡рд╛рд░рд╛ рдХрдмреНрдЬрд╛ рдХреА рдЧрдИ рдореЗрдореЛрд░реА рдХрд╛ рдЖрдХрд╛рд░ рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдмрдврд╝рддрд╛ рд╣реИ:

 {long[] a = new long[ 0]; mem(" 0", a);} // 0: 16 {long[] a = new long[ 1]; mem(" 1", a);} // 1: 24 {long[] a = new long[ 2]; mem(" 2", a);} // 2: 32 {long[] a = new long[ 3]; mem(" 3", a);} // 3: 40 {long[] a = new long[100]; mem("100", a);} // 100: 816 

рдФрд░ рд▓рд┐рдВрдХ рдХреА рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП:

 {Long[] a = new Long[ 0]; mem(" 0", a);} // 0: 16 {Long[] a = new Long[ 1]; mem(" 1", a);} // 1: 24 {Long[] a = new Long[ 2]; mem(" 2", a);} // 2: 24 {Long[] a = new Long[ 3]; mem(" 3", a);} // 3: 32 {Long[] a = new Long[100]; mem("100", a);} // 100: 416 

рдЕрдм, рдЬрд┐рдЬреНрдЮрд╛рд╕рд╛ рд╕реЗ рдмрд╛рд╣рд░, рд╣рдо рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдХрдИ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЖрдХрд╛рд░ рдХреА рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╣реИрдВ:

 mem(" Object", new Object()); // Object: 16 mem(" String", new String("ABC")); // String: 24 mem(" Exception", new Exception()); // Exception: 40 mem(" int.class", int.class); // int.class: 112 mem(" int[].class", int[].class); // int[].class: 112 mem("Object.class", Object.class); // Object.class: 112 mem("System.class", System.class); // System.class: 160 mem("String.class", String.class); // String.class: 136 

64-рдмрд┐рдЯ рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ рдЕрд▓рдЧ jdk рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди:

                 jdk1.6.0_45 jdk1.7.0_80 jdk1.8.0_191 jdk-9 jdk-12 jdk-13
                 ----------- ----------- ------------ ------ ------ ---- -
       рд╡рд╕реНрддреБ: 16 16 16 16 16 16
       рд╕реНрдЯреНрд░рд┐рдВрдЧ: 32 24 24 24 24 24
    рдЕрдкрд╡рд╛рдж: 32 32 32 40 40 40
    int.class: 104 88 104 112 104 112
  int []ред рд╡рд░реНрдЧ: рел 5рек релрекрек рек .реж резрезреи резрезрек резрезреи резрезреи
 Object.class: 600 560 496 112 104 112
 System.class: 624 560 496 144 152 160
 рд╕реНрдЯреНрд░рд┐рдВрдЧ.рдХреНрд▓рд╛рд╕: 696 640 624 136 128 136 

рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЖрдХрд╛рд░ рдХрд╛ рдЕрдиреБрдорд╛рди 24 рдмрд╛рдЗрдЯреНрд╕ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╡рд░реНрдЧ рдореЗрдВ рдХрдИ рд╕реНрдерд┐рд░ рдЪрд░, рд╕реНрдерд┐рд░ рдФрд░ рдЧреИрд░-рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐рдпрд╛рдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдпрд╣ рдирд┐рд╕реНрд╕рдВрджреЗрд╣ рд╡рд╕реНрддреБ рдореЗрдВ рд╕реНрдерд┐рд░ рдЪрд░ рдФрд░ рдХреЛрдб рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП рднреА рдпрд╣реА рд╕рдЪ рд╣реИред

рдЕрдВрдд рдореЗрдВ, рдПрдХ рдЕрдиреБрд╕реНрдорд╛рд░рдХ: рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЖрдХрд╛рд░ рдкрд░ рд╕рднреА рдбреЗрдЯрд╛ рдЕрдиреБрдорд╛рдирд┐рдд рд╣реИрдВ рдФрд░ рд╡реЗ рдХреБрдЫ рд╣рдж рддрдХ рдПрдХ рдирд┐рд╖реНрдкрд╛рджрди рд╕реЗ рджреВрд╕рд░реЗ рддрдХ рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд╡рд┐рднрд┐рдиреНрди рдЖрднрд╛рд╕реА рдорд╢реАрдиреЛрдВ рдХреЗ рд▓рд┐рдП рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

Source: https://habr.com/ru/post/hi470441/


All Articles