рдЬреЗрд╡реАрдПрдо рд╣реЙрдЯрд╕реНрдкреЙрдЯ рдореЗрдВ x86 рдХреЗ рддрд╣рдд рдмрд╛рдпреЛрдЯреЗрдХ рдЗрдВрдЯрд░рдкреНрд░реЗрдЯрд░ рдХрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХрдХрд░рдг рдФрд░ рд╕рдВрдЪрд╛рд▓рди

рд▓рдЧрднрдЧ рд╣рд░ рдЬрд╛рд╡рд╛ рдбреЗрд╡рд▓рдкрд░ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдЬрд╛рд╡рд╛ рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЛ рд╢реБрд░реВ рдореЗрдВ рдПрдХ рдЬреЗрд╡реАрдПрдо рдмрд╛рдЗрдЯрдХреЛрдб рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдорд╛рдирдХ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╡рд░реНрдЧ-рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдХреЗ рдЕрдВрджрд░ рдРрд╕реА рдХреНрд▓рд╛рд╕-рдлрд╛рдЗрд▓реНрд╕ рдорд┐рд▓рдиреЗ рдХреЗ рдмрд╛рдж рдФрд░ рдЬрдм рддрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рдЙрди рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪ рдкрд╛рддрд╛, рддрдм рддрдХ JVM рдЗрди рдХреНрд▓рд╛рд╕-рдлрд╛рдЗрд▓реНрд╕ рдореЗрдВ рдореМрдЬреВрдж рдмрд╛рдпреЛрдЯреЗрдХ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЖрд▓реЗрдЦ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ OpenJDK JVM HotSpot рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред


рд▓реЗрдЦ рдХреА рд╕рд╛рдордЧреНрд░реА:


  • рдкрд░реНрдпрд╛рд╡рд░рдг
  • рдЪрд▓ рдЬрд╛рд╡рд╛ рдЖрд╡реЗрджрди
  • рдЗрдВрдЯрд░рдкреНрд░рд┐рдЯрд░ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдФрд░ рдХрдВрдЯреНрд░реЛрд▓ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдЯреВ рдЬрд╛рд╡рд╛ рдХреЛрдб
  • рдЙрджрд╛рд╣рд░рдг

рдкрд░реНрдпрд╛рд╡рд░рдг


рдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рдо autoconf рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рдирд╡реАрдирддрдо рдЙрдкрд▓рдмреНрдз OpenJDK JDK12 рд╕рдВрд╢реЛрдзрди рдХреА рдЕрд╕реЗрдВрдмрд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ


--enable-debug --with-native-debug-symbols=internal 

рдЙрдмрдВрдЯреВ 18.04 / gcc 7.4.0 рдкрд░ред


--with-native-debug-symbols=internal рдЕрд░реНрде рд╣реИ рдХрд┐, рдЬреЗрдбрдбреАрдХреЗ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╕рдордп, рдмреИрд░рд╛рдЬ рдкреНрд░рддреАрдХреЛрдВ рдХреЛ рд╕реНрд╡рдпрдВ рдмрд╛рдпрдиреЗрд░рд┐рдЬрд╝ рдореЗрдВ рд╕рдорд╛рд╣рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред


--enable-debug - рдмрд╛рдЗрдирд░реА рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдбреАрдмрдЧрд┐рдВрдЧ рдХреЛрдб рд╣реЛрдЧрд╛ред


рдРрд╕реЗ рдорд╛рд╣реМрд▓ рдореЗрдВ JDK 12 рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдПрдХ рдЬрдЯрд┐рд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдирд╣реАрдВ рд╣реИред JDK11 рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ( JDK n, JDK n-1 рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ) рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдЬреЛ рдХреБрдЫ рднреА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА рд╡рд╣ рд╕рднреА рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдСрдЯреЛрдХреИрдлрд╝ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕рдХреЗ рдмрд╛рдж, рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдБ


 bash configure --enable-debug --with-native-debug-symbols=internal && make CONF=fastdebug images 

рдФрд░ рдереЛрдбрд╝рд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж (рдореЗрд░реЗ рд▓реИрдкрдЯреЙрдк рдкрд░ рд▓рдЧрднрдЧ 10 рдорд┐рдирдЯ), рд╣рдореЗрдВ JDK 12 рдХрд╛ рдлрд╛рд╕реНрдЯрдбрдмрдЧ рдмрд┐рд▓реНрдб рдорд┐рд▓рддрд╛ рд╣реИред


рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдпрд╣ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗ рдмрд╕ jdk рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рд╣реЛрдЧрд╛ рдФрд░ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдбрд┐рдмрдЧ рдкреНрд░рддреАрдХреЛрдВ рдХреЗ рд╕рд╛рде рдУрдкрдирдЬреЗрдбрдХ-рдПрдХреНрд╕рдПрдХреНрд╕рдПрдХреНрд╕-рдбреАрдмреАрдЬреА рдкреИрдХреЗрдЬ рд╡рд┐рддрд░рд┐рдд рдХрд░реЗрдВ, рдЬрд╣рд╛рдВ xx jdk рд╕рдВрд╕реНрдХрд░рдг рд╣реИ, рд▓реЗрдХрд┐рди рдлрд╛рд╕реНрдЯрдбрдмреЗрдХ рдЕрд╕реЗрдВрдмрд▓реА gdb рд╕реЗ рдбреАрдмрдЧрд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЬреАрд╡рди рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред рдлрд┐рд▓рд╣рд╛рд▓, рдореИрдВ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ ps () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, gdb рд╕реЗ рдЬрд╛рд╡рд╛ рд╕реНрдЯреИрдХ рдХреЗ рдирд┐рд╢рд╛рди рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди, рдФрд░ pfl () , рдлрд╝реНрд░реЗрдо рдХреЗ рд╕реНрдЯреИрдХ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди (рдпрд╣ gdb рдореЗрдВ рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЛ рдбреАрдмрдЧ рдХрд░рддреЗ рд╕рдордп рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ)ред


рдЙрджрд╛рд╣рд░рдг ps () рдФрд░ pfl ()

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрди gdb рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ


 #   java file /home/dmitrii/jdk12/build/linux-x86_64-server-fastdebug/images/jdk/bin/java #   SEGV-, HotSpot #  SEGV  . #, https://hg.openjdk.java.net/jdk/jdk12/file/06222165c35f/src/hotspot/cpu/x86/vm_version_x86.cpp#l361 handle SIGSEGV nostop noprint set breakpoint pending on set pagination off #  ,   #    # java- public static void main(String args[]) b PostJVMInit thread 2 commands #   , #    set $buf = (char *) malloc(1000) #        #(   ) b *AbstractInterpreter::_entry_table[0] thread 2 commands #      rbx. #   Method* set $mthd = ((Method *) $rbx) #    $buf call $mthd->name_and_sig_as_C_string($buf, 1000) # ,  public static void main(String args) if strcmp()("Main.main([Ljava/lang/String;)V", $buf) == 0 #   ,      # ps/pfl        #(    ps/pfl) b InterpreterRuntime::build_method_counters(JavaThread*, Method*) commands #  ,    #   delete breakpoints call ps() call pfl() c end end c end c end r -cp /home/dmitrii/jdk12/ Main 

рдРрд╕реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИ:


 "Executing ps" for thread: "main" #1 prio=5 os_prio=0 cpu=468,61ms elapsed=58,65s tid=0x00007ffff001b800 nid=0x5bfa runnable [0x00007ffff7fd9000] java.lang.Thread.State: RUNNABLE Thread: 0x00007ffff001b800 [0x5bfa] State: _running _has_called_back 0 _at_poll_safepoint 0 JavaThread state: _thread_in_Java 1 - frame( sp=0x00007ffff7fd9920, unextended_sp=0x00007ffff7fd9920, fp=0x00007ffff7fd9968, pc=0x00007fffd828748b) Main.main(Main.java:10) "Executing pfl" for thread: "main" #1 prio=5 os_prio=0 cpu=468,83ms elapsed=58,71s tid=0x00007ffff001b800 nid=0x5bfa runnable [0x00007ffff7fd9000] java.lang.Thread.State: RUNNABLE Thread: 0x00007ffff001b800 [0x5bfa] State: _running _has_called_back 0 _at_poll_safepoint 0 JavaThread state: _thread_in_Java [Describe stack layout] 0x00007ffff7fd99e0: 0x00007ffff7fd9b00 #2 entry frame call_stub word fp - 0 0x00007ffff7fd99d8: 0x00007ffff7fd9c10 call_stub word fp - 1 0x00007ffff7fd99d0: 0x00007fffd8287160 call_stub word fp - 2 0x00007ffff7fd99c8: 0x00007fffbf1fb3e0 call_stub word fp - 3 0x00007ffff7fd99c0: 0x000000000000000a call_stub word fp - 4 0x00007ffff7fd99b8: 0x00007ffff7fd9ce8 call_stub word fp - 5 0x00007ffff7fd99b0: 0x00007ffff7fd9a80 call_stub word fp - 6 0x00007ffff7fd99a8: 0x00007ffff001b800 call_stub word fp - 7 0x00007ffff7fd99a0: 0x00007ffff7fd9b40 call_stub word fp - 8 0x00007ffff7fd9998: 0x00007ffff7fd9c00 call_stub word fp - 9 0x00007ffff7fd9990: 0x00007ffff7fd9a80 call_stub word fp - 10 0x00007ffff7fd9988: 0x00007ffff7fd9ce0 call_stub word fp - 11 0x00007ffff7fd9980: 0x00007fff00001fa0 call_stub word fp - 12 0x00007ffff7fd9978: 0x0000000716a122b8 sp for #2 locals for #1 unextended_sp for #2 local 0 0x00007ffff7fd9970: 0x00007fffd82719f3 0x00007ffff7fd9968: 0x00007ffff7fd99e0 #1 method Main.main([Ljava/lang/String;)V @ 0 - 1 locals 1 max stack 0x00007ffff7fd9960: 0x00007ffff7fd9978 interpreter_frame_sender_sp 0x00007ffff7fd9958: 0x0000000000000000 interpreter_frame_last_sp 0x00007ffff7fd9950: 0x00007fffbf1fb3e0 interpreter_frame_method 0x00007ffff7fd9948: 0x0000000716a11c40 interpreter_frame_mirror 0x00007ffff7fd9940: 0x0000000000000000 interpreter_frame_mdp 0x00007ffff7fd9938: 0x00007fffbf1fb5e8 interpreter_frame_cache 0x00007ffff7fd9930: 0x00007ffff7fd9978 interpreter_frame_locals 0x00007ffff7fd9928: 0x00007fffbf1fb3d0 interpreter_frame_bcp 0x00007ffff7fd9920: 0x00007ffff7fd9920 sp for #1 interpreter_frame_initial_sp unextended_sp for #1 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, ps() рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдореЗрдВ рд╕рд┐рд░реНрдл рдХреЙрд▓ рд╕реНрдЯреИрдХ рдорд┐рд▓рддрд╛ рд╣реИ, pfl() рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ pfl() - рдкреВрд░реНрдг рд╕реНрдЯреИрдХ рд╕рдВрдЧрдардиред


рдЪрд▓ рдЬрд╛рд╡рд╛ рдЖрд╡реЗрджрди


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


 public class Main { public static void main(String args[]){ } } 

рдФрд░ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдХрд┐ рдЬрдм рдЖрдк рдРрд╕рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЪрд▓рд╛рддреЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ:


javac Main.java && java Main


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


/home/dmitrii/jdk12/build/linux-x86_64-server-fastdebug/images/jdk/bin/java ред


рд▓реЗрдХрд┐рди рдЕрдВрдд рдореЗрдВ, рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЦрд╛рд╕ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдПрдХ рдмрд╛рдЗрдирд░реА рд╣реИ, рдЬреЛ рдПрдХ рд╕рд╛рде debazhnymi рдкреНрд░рддреАрдХреЛрдВ рдХреЗ рд╕рд╛рде рдХреЗрд╡рд▓ 20KB рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдХреЗрд╡рд▓ рдПрдХ рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓ рд▓реЙрдиреНрдЪрд░ / main.c рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рд╡рд╣ рдЬреЛ рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рддрд░реНрдХ (рдЪрд╛рд░ * argv []) рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, JDK_JAVA_OPTIONS рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рд╕реЗ рддрд░реНрдХ рдкрдврд╝рддрд╛ рд╣реИ , рдмреБрдирд┐рдпрд╛рджреА рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдФрд░ рд╕рддреНрдпрд╛рдкрди рдХрд░рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдЗрд╕ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдореЗрдВ рдПрдХ рдЯрд░реНрдорд┐рдирд▓ рд╡рд┐рдХрд▓реНрдк рдпрд╛ рдореБрдЦреНрдп рд╡рд░реНрдЧ рдХрд╛ рдирд╛рдо рдирд╣реАрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ) рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВред рдкрд░рд┐рдгрд╛рдореА рддрд░реНрдХ рд╕реВрдЪреА рдХреЗ рд╕рд╛рде JLI_Launch ред


JLI_Launch рдлрд╝рдВрдХреНрд╢рди рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдЬрд╛рд╡рд╛ рдмрд╛рдЗрдирд░реА рдореЗрдВ рдирд┐рд╣рд┐рдд рдирд╣реАрдВ рд╣реИ рдФрд░, рдпрджрд┐ рдЖрдк рдЗрд╕рдХреЗ рдкреНрд░рддреНрдпрдХреНрд╖ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ:


 $ ldd java linux-vdso.so.1 (0x00007ffcc97ec000) libjli.so => /home/dmitrii/jdk12/build/linux-x86_64-server-fastdebug/images/jdk/bin/./../lib/libjli.so (0x00007ff27518d000) // <---------    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ff274d9c000) libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007ff274b7f000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007ff27497b000) libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007ff27475c000) /lib64/ld-linux-x86-64.so.2 (0x00007ff27559f000) 

рдЖрдк libjli.so рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рд▓реЙрдиреНрдЪрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ - рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдПрдХ рд╕реЗрдЯ рдЬреЛ рдЬрд╛рд╡рд╛ рдПрдХ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдФрд░ рд╕реНрдЯрд╛рд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмреАрдЪ рдореЗрдВ JLI_Launch рд╣реИред


рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреА рдкреВрд░реА рд╕реВрдЪреА
 $ objdump -T -j .text libjli.so libjli.so: file format elf64-x86-64 DYNAMIC SYMBOL TABLE: 0000000000009280 g DF .text 0000000000000038 Base JLI_List_add 0000000000003330 g DF .text 00000000000001c3 Base JLI_PreprocessArg 0000000000008180 g DF .text 0000000000000008 Base JLI_GetStdArgs 0000000000008190 g DF .text 0000000000000008 Base JLI_GetStdArgc 0000000000007e50 g DF .text 00000000000000b8 Base JLI_ReportErrorMessage 000000000000a400 g DF .text 00000000000000df Base JLI_ManifestIterate 0000000000002e70 g DF .text 0000000000000049 Base JLI_InitArgProcessing 0000000000008000 g DF .text 0000000000000011 Base JLI_ReportExceptionDescription 0000000000003500 g DF .text 0000000000000074 Base JLI_AddArgsFromEnvVar 0000000000007f10 g DF .text 00000000000000e9 Base JLI_ReportErrorMessageSys 0000000000005840 g DF .text 00000000000000b8 Base JLI_ReportMessage 0000000000009140 g DF .text 000000000000003a Base JLI_SetTraceLauncher 0000000000009020 g DF .text 000000000000000a Base JLI_MemFree 0000000000008f90 g DF .text 0000000000000026 Base JLI_MemAlloc 00000000000059c0 g DF .text 0000000000002013 Base JLI_Launch 00000000000091c0 g DF .text 000000000000003b Base JLI_List_new 0000000000008ff0 g DF .text 0000000000000026 Base JLI_StringDup 0000000000002ec0 g DF .text 000000000000000c Base JLI_GetAppArgIndex 

JLI_Launch рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд╣рд╕реНрддрд╛рдВрддрд░рдг рдХреЗ рдмрд╛рдж, JVM рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреИрд╕реЗ:


рдореИрдВ рдПрдХ рд╡реАрдПрдо рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП JVM HotSpot рд╡рд░реНрдгреЛрдВ рдХреЛ рдореЗрдореЛрд░реА рдореЗрдВ рд▓реЛрдб рдХрд░рдирд╛ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ред


рд╕рднреА JVM HotSpot рдХреЛрдб libjvm.so рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИред Libjvm.so рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдг рдкрде рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдореЗрдореЛрд░реА рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЬреЗрдПрдирдЖрдИ_рдХреНрд░реАрдЯ рдЬреЗрд╡рд╛рд╡реАрдПрдордПрдо рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдкреЙрдЗрдВрдЯрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдмрд╛рдж рдореЗрдВ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдХреЛ рдмрдирд╛рдиреЗ рдФрд░ рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рдЬрд╛рд╣рд┐рд░ рд╣реИ libjvm.so libjli.so рд╕реЗ рдЬреБрдбрд╝реА рдирд╣реАрдВ рд╣реИ


II ред рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЗ рдмрд╛рдж рдкрд╛рд░реНрд╕рд┐рдВрдЧ рддрд░реНрдХ рдкрд╛рд░рд┐рдд рд╣реБрдПред


ParseArguments рдмреЛрд▓рдиреЗ рд╡рд╛рд▓реЗ рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рд╕реЗ рдкрд╛рд░рд┐рдд рддрд░реНрдХреЛрдВ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рддрд░реНрдХ рдкрд╛рд░реНрд╕рд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдореЛрдб рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ


 enum LaunchMode { // cf. sun.launcher.LauncherHelper LM_UNKNOWN = 0, LM_CLASS, LM_JAR, LM_MODULE, LM_SOURCE }; 

рдпрд╣ рддрд░реНрдХреЛрдВ рдХреЗ рднрд╛рдЧ рдХреЛ рдкреНрд░рд╛рд░реВрдк -DpropertyName=propertyValue рднреА рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП -Djava.class.path=/path рдХреЛ -Djava.class.path=/path рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ -Djava.class.path=/path ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рддрд░рд╣ рдХреА SystemProperty рдХреЛ JVM рд╣реЙрдЯрд╕реНрдкреЙрдЯ рдореЗрдВ рд╡реИрд╢реНрд╡рд┐рдХ рд╕рд░рдгреА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ java.lang.System::props рднреЗрдЬ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ java.lang.System::props рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рдкрд╣рд▓реЗ рдЪрд░рдг рдореЗрдВ java.lang.System::props (JDK12 рдореЗрдВ, java .lang.System.props рдХреЗ рдЖрд░рдВрднреАрдХрд░рдг рддрдВрддреНрд░ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕ рдХрдорд┐рдЯ рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХ)ред


рдкрд╛рд░реНрд╕рд┐рдВрдЧ рддрд░реНрдХреЛрдВ рдореЗрдВ рдХреБрдЫ рд╡рд┐рдХрд▓реНрдк рднреА рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдЬреЛ рдЬреЗрд╡реАрдПрдо рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП --list-modules , рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╕реАрдзреЗ рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рд▓рд╛рдВрдЪрд░ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ)ред


III ред рдПрдХ рдкреНрд░рд╛рдЗрдорд░реА рдереНрд░реЗрдб рдлреЛрд░реНрдХ рдХрд░реЗрдВ рдФрд░ рдЗрд╕рдореЗрдВ рдПрдХ рд╡реАрдПрдо рдмрдирд╛рдПрдВ


рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдХреБрдЫ рдЧрд▓рдд рд╣реЛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдореБрдЦреНрдп рдзрд╛рдЧреЗ рдореЗрдВ рдЬреЗрд╡реАрдПрдо рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ "рдмрд╕ рдЗрд╕реЗ рдЖрдЬрд╝рдорд╛рдПрдВ"ред


рдкреНрд░рд╢реНрди рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рд╕рдВрднрд╛рд╡рд┐рдд рдХрд╛рд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдкрд╛рдпрд╛ рдХрд┐ рдЬреЗрд╡реАрдПрдо рдореБрдЦреНрдп рдзрд╛рдЧреЗ рдореЗрдВ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ (рдХрдо рд╕реЗ рдХрдо рд▓рд┐рдирдХреНрд╕ рдкрд░) pthreads рдФрд░ рдореБрдЦреНрдп рдзрд╛рдЧрд╛ рд╕реНрдЯреИрдХ рдХреЗ рд╕рд╛рде рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдореБрдЦреНрдп-рд╕реВрддреНрд░ рдХрд╛ рдЖрдХрд╛рд░ ulimit -s рджреНрд╡рд╛рд░рд╛ рд╕реАрдорд┐рдд рд╣реИ, рдЕрд░реНрдерд╛рддред рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдмрдбрд╝реЗ рдореВрд▓реНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╕рдордп, рд╣рдо рдПрдХ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдмрдбрд╝реЗ рд╕реНрдЯреИрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдореБрдЦреНрдп рдзрд╛рдЧрд╛ MAP_GROWSDOWN рдХреЗ рд╕рдорд╛рди рдХреБрдЫ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди MAP_GROWSDOWN рдирд╣реАрдВред рдЕрдкрдиреЗ рд╢реБрджреНрдз рд░реВрдк рдореЗрдВ MAP_GROWSDOWN рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИ рдФрд░, рдпрджрд┐ рд╕реНрдореГрддрд┐ рдореБрдЭреЗ рд╕рд╣реА рд╕реЗрд╡рд╛ рджреЗрддреА рд╣реИ, рддреЛ рд▓реЙрдХ рд╣реИред рдореЗрд░реА рдорд╢реАрди рдкрд░, MAP_GROWSDOWN рдХреЛрдИ рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рдбрд╛рд▓рддрд╛ рд╣реИред рдореБрдЦреНрдп-рдереНрд░реЗрдб рдореИрдкрд┐рдВрдЧ рдФрд░ MAP_GROWSDOWN рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ MAP_FIXED рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде рдХреЛрдИ рдЕрдиреНрдп mmap рд╕рдВрднрд╡ рд╕реНрдЯреИрдХ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрдШрд░реНрд╖ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд╕реЗ рд╕рднреА рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рд╕рдВрдмрдВрдзрд┐рдд rsp рдореВрд▓реНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ rsp рдФрд░ рдлрд┐рд░ рдУрдПрд╕ рдЗрд╕рдХрд╛ рдкрддрд╛ rsp : рдФрд░ рдкреЗрдЬ-рдлреЙрд▓реНрдЯ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░реЗрдЧрд╛ рдФрд░ рдЧрд╛рд░реНрдб рд╕реЗрдЯ рдХрд░реЗрдЧрд╛ ред рдпрд╣ рдЕрдВрддрд░ рдХрдИ рд░реЗрдХ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ: рдЧрд╛рд░реНрдб рд╕реНрдЯреНрд░реАрдо рдмрдирд╛рддреЗ рд╕рдордп , рд╡рд░реНрддрдорд╛рди рд╕реНрдЯреНрд░реАрдо рдХреЗ рд╕реНрдЯреИрдХ рдХрд╛ рдЖрдХрд╛рд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╕рдордп


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


рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рдПрдХ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ рдХрд╛рд▓рд╛ рдЬрд╛рджреВ рдЖрд░рдВрднреАрдХрд░рдг, рд╣рдо рдЙрдирдореЗрдВ рд╕реЗ рдХреЗрд╡рд▓ рдХреБрдЫ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦреЗрдВрдЧреЗред


рдЗрдВрдЯрд░рдкреНрд░реЗрдЯрд░ рдХреА рд╢реБрд░реВрдЖрдд рдФрд░ рдЬрд╛рд╡рд╛ рдХреЛрдб рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рдХрд╛ рд╣рд╕реНрддрд╛рдВрддрд░рдг


рдЬреЗрд╡реАрдПрдо рд╣реЙрдЯрд╕реНрдкреЙрдЯ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╢реАрди рдХреЛрдб рдЯреЗрдореНрдкрд▓реЗрдЯ рд╣реИред рдЬрдм рджреБрднрд╛рд╖рд┐рдпрд╛ рдПрдХ рдирд┐рд░реНрджреЗрд╢ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдкрд╣рд▓реА рдЪреАрдЬ рдЬреЛ рдЙрд╕рдХреЗ рд▓рд┐рдП рджрд┐рдЦрддреА рд╣реИ рд╡рд╣ рд╣реИ рд╡рд┐рд╢реЗрд╖ рдбрд┐рд╕реНрдкреИрдЪ рдЯреЗрдмрд▓ рдореЗрдВ рдЗрд╕рдХреЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдкрддрд╛ред рдЕрдЧрд▓рд╛, рдЗрд╕ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЗ рдкрддреЗ рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, jvm рдХреНрд░рдо рдореЗрдВ рдЕрдЧрд▓реЗ рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдкрддрд╛ рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИ) рдФрд░ рдЗрд╕реЗ рдЙрд╕реА рддрд░рд╣ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реА рддрд░рд╣ред рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдХреЗрд╡рд▓ "рдкреНрд░реЗрд╖рдг" рди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЗ рд╕рд╛рде рджреЗрдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдирд┐рд░реНрджреЗрд╢ ( xsub , xsub , рдЖрджрд┐, рдЬрд╣рд╛рдВ x - i , l , f , d )ред рд╡реЗ рд╕рднреА рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдСрдкрд░реЗрд╢рди рдХрд░рддреЗ рд╣реИрдВред


рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдордВрдЧрд▓рд╛рдЪрд░рдг рдирд┐рд░реНрджреЗрд╢ ( invokestatic , invokevirtual , рдЗрддреНрдпрд╛рджрд┐), рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рдЕрдЧрд▓рд╛ рдирд┐рд░реНрджреЗрд╢ рдкрд╣рд▓реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реЛрдЧреА рдЬрд┐рд╕реЗ рддрдерд╛рдХрдерд┐рдд рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред рдРрд╕реЗ рдирд┐рд░реНрджреЗрд╢ рд╕реНрд╡рдпрдВ рдЕрдкрдиреЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЕрдЧрд▓реЗ рдмрд╛рдпреЛрдЯреЗрдХреЛрдб-рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдкрддрд╛ рдбрд╛рд▓рддреЗ рд╣реИрдВред


Threads::create_vm рдореЗрдВ рдЗрд╕ рдорд╢реАрди рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Threads::create_vm , рдХрдИ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдЬрд┐рди рдкрд░ рджреБрднрд╛рд╖рд┐рдпрд╛ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ:


рдореИрдВ рдЙрдкрд▓рдмреНрдз рдмрд╛рдЗрдЯрдХреЛрдб рдХреА рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдЖрд░рдореНрдн рдХрд░рдирд╛


рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЗ рдЖрд░рдВрдн рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдмрдврд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдмрд╛рдпреЛрдЯреЗрдХ рдХреА рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдЖрд░рдВрднреАрдХреГрдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЗрд╕реЗ рдмрд╛рдЗрдЯрдХреЛрдбреНрд╕ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ :: рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдмрд╣реБрдд рдкрдардиреАрдп рд▓реЗрдмрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рдПред рдЗрд╕рдХрд╛ рдЯреБрдХрдбрд╝рд╛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ:


  // Java bytecodes // bytecode bytecode name format wide f. result tp stk traps def(_nop , "nop" , "b" , NULL , T_VOID , 0, false); def(_aconst_null , "aconst_null" , "b" , NULL , T_OBJECT , 1, false); def(_iconst_m1 , "iconst_m1" , "b" , NULL , T_INT , 1, false); def(_iconst_0 , "iconst_0" , "b" , NULL , T_INT , 1, false); def(_iconst_1 , "iconst_1" , "b" , NULL , T_INT , 1, false); def(_iconst_2 , "iconst_2" , "b" , NULL , T_INT , 1, false); def(_iconst_3 , "iconst_3" , "b" , NULL , T_INT , 1, false); def(_iconst_4 , "iconst_4" , "b" , NULL , T_INT , 1, false); def(_iconst_5 , "iconst_5" , "b" , NULL , T_INT , 1, false); def(_lconst_0 , "lconst_0" , "b" , NULL , T_LONG , 2, false); def(_lconst_1 , "lconst_1" , "b" , NULL , T_LONG , 2, false); def(_fconst_0 , "fconst_0" , "b" , NULL , T_FLOAT , 1, false); def(_fconst_1 , "fconst_1" , "b" , NULL , T_FLOAT , 1, false); def(_fconst_2 , "fconst_2" , "b" , NULL , T_FLOAT , 1, false); def(_dconst_0 , "dconst_0" , "b" , NULL , T_DOUBLE , 2, false); def(_dconst_1 , "dconst_1" , "b" , NULL , T_DOUBLE , 2, false); def(_bipush , "bipush" , "bc" , NULL , T_INT , 1, false); def(_sipush , "sipush" , "bcc" , NULL , T_INT , 1, false); def(_ldc , "ldc" , "bk" , NULL , T_ILLEGAL, 1, true ); def(_ldc_w , "ldc_w" , "bkk" , NULL , T_ILLEGAL, 1, true ); def(_ldc2_w , "ldc2_w" , "bkk" , NULL , T_ILLEGAL, 2, true ); 

рдЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдЗрдЯрдХреЛрдб рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреА рд▓рдВрдмрд╛рдИ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ (рдЖрдХрд╛рд░ рд╣рдореЗрд╢рд╛ 1 рдмрд╛рдЗрдЯ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди ConstantPool рдореЗрдВ рдПрдХ рдЗрдВрдбреЗрдХреНрд╕ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде рд╡рд┐рд╕реНрддреГрдд рдмрд╛рдпреЛрдЯреЗрдХ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ), рдирд╛рдо, рдмрд╛рдЗрдЯрдХреЛрдб рдФрд░ рдЭрдВрдбреЗ:


 bool Bytecodes::_is_initialized = false; const char* Bytecodes::_name [Bytecodes::number_of_codes]; BasicType Bytecodes::_result_type [Bytecodes::number_of_codes]; s_char Bytecodes::_depth [Bytecodes::number_of_codes]; u_char Bytecodes::_lengths [Bytecodes::number_of_codes]; Bytecodes::Code Bytecodes::_java_code [Bytecodes::number_of_codes]; unsigned short Bytecodes::_flags [(1<<BitsPerByte)*2]; 

рджреБрднрд╛рд╖рд┐рдпрд╛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред


II ред рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХреИрд╢ рдХреЛрдб


рджреБрднрд╛рд╖рд┐рдпрд╛ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдЗрд╕ рд╡реНрдпрд╡рд╕рд╛рдп рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреА рд╣реЛрдЧреАред рдХреИрд╢ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдЖрд░рдХреНрд╖рдг рд╕рдорд╛рди рдирд╛рдо рдХреЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреЛрдб рдХреИрд╢ :: рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ () ред рдЬреИрд╕рд╛ рдХрд┐ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдЕрдиреБрднрд╛рдЧ рд╕реЗ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ


  CodeCacheExpansionSize = align_up(CodeCacheExpansionSize, os::vm_page_size()); if (SegmentedCodeCache) { // Use multiple code heaps initialize_heaps(); } else { // Use a single code heap FLAG_SET_ERGO(uintx, NonNMethodCodeHeapSize, 0); FLAG_SET_ERGO(uintx, ProfiledCodeHeapSize, 0); FLAG_SET_ERGO(uintx, NonProfiledCodeHeapSize, 0); ReservedCodeSpace rs = reserve_heap_memory(ReservedCodeCacheSize); add_heap(rs, "CodeCache", CodeBlobType::All); } 

рдХреИрд╢ рдХреЛрдб рд╡рд┐рдХрд▓реНрдк -XX:ReservedCodeCacheSize рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ -XX:ReservedCodeCacheSize , -XX:SegmentedCodeCache , -XX:CodeCacheExpansionSize , -XX:NonNMethodCodeHeapSize , -XX:ProfiledCodeHeapSize , -XX:NonProfiledCodeHeapSize ред рдЗрди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд┐рд╡рд░рдг рдЙрди рд▓рд┐рдВрдХреНрд╕ рдкрд░ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рдирдХреЗ рд▓рд┐рдП рд╡реЗ рдиреЗрддреГрддреНрд╡ рдХрд░рддреЗ рд╣реИрдВред рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдПрд░реНрдЧреЛрдиреЛрдорд┐рдХ рд░реВрдк рд╕реЗ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ SegmentedCodeCache рдорд╛рди рдХрд╛ SegmentedCodeCache рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ (рдмрдВрдж) SegmentedCodeCache рд╣реИ, рддреЛ рдХреЛрдб рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде >= 240Mb , SegmentedCodeCache рдХреЛ CompilerConfig :: set_tiered_flags рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред


рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдХрд╛рд░ рдХрд╛ рдПрдХ рдХреНрд╖реЗрддреНрд░ ReservedCodeCacheSize рдмрд╛рдЗрдЯреНрд╕ ReservedCodeCacheSize ред рдпрджрд┐ SegmentedCodeCache рдЙрдЬрд╛рдЧрд░ рд╣реЛ рдЧрдпрд╛, рддреЛ рдпрд╣ рдХреНрд╖реЗрддреНрд░ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реИ: JIT- рд╕рдВрдХрд▓рд┐рдд рд╡рд┐рдзрд┐рдпрд╛рдБ, рдЫреБрд░рд╛ рд░реВрдЯреАрди, рдЖрджрд┐ред


III ред рджреБрднрд╛рд╖рд┐рдпрд╛ рдкреИрдЯрд░реНрди рдХреА рд╢реБрд░реБрдЖрдд


рдмрд╛рдЗрдЯрдХреЛрдб рддрд╛рд▓рд┐рдХрд╛ рдФрд░ рдХреИрд╢ рдХреЛрдб рдХреЛ рдкреНрд░рд╛рд░рдВрдн рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рджреБрднрд╛рд╖рд┐рдпрд╛ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреА рдХреЛрдб рдкреАрдврд╝реА рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рджреБрднрд╛рд╖рд┐рдпрд╛ рдкрд╣рд▓реЗ рдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХреИрд╢ рдХреЛрдб рд╕реЗ рдПрдХ рдмрдлрд░ рд░рдЦрддрд╛ рд╣реИред рдХреЛрдб рдкреАрдврд╝реА рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рдг рдореЗрдВ, рдХреЛрдбрд▓реЗрдЯ - рдХреЛрдб рдХреЗ рдЫреЛрдЯреЗ рд╡рд░реНрдЧреЛрдВ - рдХреЛ рдмрдлрд░ рд╕реЗ рдХрд╛рдЯ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╡рд░реНрддрдорд╛рди рдкреАрдврд╝реА рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдХреЛрдбрд▓реЗрдЯ рдХрд╛ рд╡рд╣ рднрд╛рдЧ рдЬреЛ рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЙрд╕реЗ рдореБрдХреНрдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдмрд╛рдж рдХреА рдкреАрдврд╝реА рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред


рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЗрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:



  { CodeletMark cm(_masm, "slow signature handler"); AbstractInterpreter::_slow_signature_handler = generate_slow_signature_handler(); } 

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



  { CodeletMark cm(_masm, "error exits"); _unimplemented_bytecode = generate_error_exit("unimplemented bytecode"); _illegal_bytecode_sequence = generate_error_exit("illegal bytecode sequence - method not verified"); } 

VM рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рджреМрд░рд╛рди рдХреНрд▓рд╛рд╕рдлрд╛рдЗрд▓реНрд╕ рдХреЛ рдорд╛рдиреНрдп рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рд╕реНрдЯреИрдХ рдкрд░ рджрд┐рдП рдЧрдП рддрд░реНрдХ рдЙрд╕ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреА рдЬрд░реВрд░рдд рд╣реЛрддреА рд╣реИ рдпрд╛ рдмрд╛рдИрдЯрдХреЛрдб рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡реАрдПрдо рдХреЛ рдкрддрд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдпреЗ рд╕реНрдЯрдмреНрд╕ рддрдм рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдЬрдм рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдпреЛрдЯреЗрдХ рдХреЗ рд▓рд┐рдП рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЛрдб рдмрдирд╛рддреЗ рд╣реИрдВред



рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдлреНрд░реЗрдо рд╕реНрдЯреИрдХ рд╕реЗ рдбреЗрдЯрд╛ рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЬреЛ рдХрд┐ рдЙрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рд╕реЗ рдкрд╣рд▓реЗ рдерд╛ рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рд░рд┐рдЯрд░реНрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред



рджреБрднрд╛рд╖рд┐рдпрд╛ рд╕реЗ рд░рдирдЯрд╛рдЗрдо рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред



  // Bytecodes set_entry_points_for_all_bytes(); // installation of code in other places in the runtime // (ExcutableCodeManager calls not needed to copy the entries) set_safepoints_for_all_bytes(); 

рдирд┐рд░реНрджреЗрд╢ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡реАрдПрдо рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЛ рдСрдкрд░реЗрдВрдб рд╕реНрдЯреИрдХ рдореЗрдВ рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╣реЙрдЯрд╕реНрдкреЙрдЯ рдХреЛ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рдХреИрд╢рд┐рдВрдЧ рдХрд░рдиреЗ рд╕реЗ рдирд╣реАрдВ рд░реЛрдХрддрд╛ рд╣реИред рд╕реНрдЯреИрдХ рдХреЗ рд╢реАрд░реНрд╖ рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдЧрдгрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред


 enum TosState { // describes the tos cache contents btos = 0, // byte, bool tos cached ztos = 1, // byte, bool tos cached ctos = 2, // char tos cached stos = 3, // short tos cached itos = 4, // int tos cached ltos = 5, // long tos cached ftos = 6, // float tos cached dtos = 7, // double tos cached atos = 8, // object cached vtos = 9, // tos not cached number_of_states, ilgl // illegal state: should not occur }; 

рдкреНрд░рддреНрдпреЗрдХ рдирд┐рд░реНрджреЗрд╢ рдвреЗрд░ рдХреЗ рдКрдкрд░ TosState рдХреЗ рдЗрдирдкреБрдЯ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рд╕реНрдерд┐рддрд┐ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдкреИрдЯрд░реНрди рдХреА рдкреАрдврд╝реА рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╣реЛрддреА рд╣реИред рдпреЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдПрдХ рдкрдардиреАрдп рдЯреЗрдореНрдкрд▓реЗрдЯ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдЖрд░рдВрднреАрдХреГрдд рд╣реЛрддреЗ рд╣реИрдВред рдЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдПрдХ рдЕрдВрд╢ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:


 // interpr. templates // Java spec bytecodes ubcp|disp|clvm|iswd in out generator argument def(Bytecodes::_nop , ____|____|____|____, vtos, vtos, nop , _ ); def(Bytecodes::_aconst_null , ____|____|____|____, vtos, atos, aconst_null , _ ); def(Bytecodes::_iconst_m1 , ____|____|____|____, vtos, itos, iconst , -1 ); def(Bytecodes::_iconst_0 , ____|____|____|____, vtos, itos, iconst , 0 ); def(Bytecodes::_iconst_1 , ____|____|____|____, vtos, itos, iconst , 1 ); def(Bytecodes::_iconst_2 , ____|____|____|____, vtos, itos, iconst , 2 ); def(Bytecodes::_iconst_3 , ____|____|____|____, vtos, itos, iconst , 3 ); def(Bytecodes::_iconst_4 , ____|____|____|____, vtos, itos, iconst , 4 ); def(Bytecodes::_iconst_5 , ____|____|____|____, vtos, itos, iconst , 5 ); def(Bytecodes::_lconst_0 , ____|____|____|____, vtos, ltos, lconst , 0 ); def(Bytecodes::_lconst_1 , ____|____|____|____, vtos, ltos, lconst , 1 ); def(Bytecodes::_fconst_0 , ____|____|____|____, vtos, ftos, fconst , 0 ); def(Bytecodes::_fconst_1 , ____|____|____|____, vtos, ftos, fconst , 1 ); def(Bytecodes::_fconst_2 , ____|____|____|____, vtos, ftos, fconst , 2 ); def(Bytecodes::_dconst_0 , ____|____|____|____, vtos, dtos, dconst , 0 ); def(Bytecodes::_dconst_1 , ____|____|____|____, vtos, dtos, dconst , 1 ); def(Bytecodes::_bipush , ubcp|____|____|____, vtos, itos, bipush , _ ); def(Bytecodes::_sipush , ubcp|____|____|____, vtos, itos, sipush , _ ); 

рд╣рдо рд╡рд┐рд╢реЗрд╖ рд░реВрдк in , out рдФрд░ generator рдХреЙрд▓рдо in рд░реБрдЪрд┐ рд▓реЗрдВрдЧреЗред


in - рдирд┐рд░реНрджреЗрд╢ рд╢реБрд░реВ рд╣реЛрдиреЗ рдХреЗ рд╕рдордп рд╕реНрдЯреИрдХ рдХреЗ рд╢реАрд░реНрд╖ рдХреА рд╕реНрдерд┐рддрд┐
рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рд╕рдордп рд╕реНрдЯреИрдХ рдХреЗ рд╢реАрд░реНрд╖ рдХреА рд╕реНрдерд┐рддрд┐
generator - рдорд╢реАрди рдЕрдиреБрджреЗрд╢ рдХреЛрдб рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рдЬрдирд░реЗрдЯрд░


рд╕рднреА рдмрд╛рдЗрдЯрдХреЛрдб рдХреЗ рд▓рд┐рдП рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рд╕рд╛рдорд╛рдиреНрдп рджреГрд╢реНрдп рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:


  1. рдпрджрд┐ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд╖рдг рдмрд┐рдЯ рд╕реЗрдЯ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЕрдиреБрджреЗрд╢ рдкреНрд░рд╕реНрддрд╛рд╡ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (x86 рдкрд░ рдиреЛ-рдСрдк)


  2. generator рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдорд╢реАрди рдХреЛрдб рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ


  3. рдпрджрд┐ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд╖рдг рдмрд┐рдЯ рд╕реЗрдЯ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЕрдЧрд▓реА рдЕрдиреБрджреЗрд╢ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреНрд░рдордг рд╕реНрдЯреИрдХ рдХреЗ рд╢реАрд░реНрд╖ рдХреА рдмрд╛рд╣рд░реА рд╕реНрдерд┐рддрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрд┐рдпрд╛ out , рдЬреЛ рдЕрдЧрд▓реЗ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд▓рд┐рдП рд╣реЛрдЧрд╛



рдкрд░рд┐рдгрд╛рдореА рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рдкрддрд╛ рд╡реИрд╢реНрд╡рд┐рдХ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдбреАрдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рд╣реЙрдЯрд╕реНрдкреЙрдЯ рдореЗрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдирд┐рдореНрди рдбрдВрдмрд▓ рдХреЛрдб рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ:


рдирд┐рд░реНрджреЗрд╢ рдХреЛрдб рдЬрдирд░реЗрдЯрд░
 void TemplateInterpreterGenerator::set_entry_points(Bytecodes::Code code) { CodeletMark cm(_masm, Bytecodes::name(code), code); // initialize entry points assert(_unimplemented_bytecode != NULL, "should have been generated before"); assert(_illegal_bytecode_sequence != NULL, "should have been generated before"); address bep = _illegal_bytecode_sequence; address zep = _illegal_bytecode_sequence; address cep = _illegal_bytecode_sequence; address sep = _illegal_bytecode_sequence; address aep = _illegal_bytecode_sequence; address iep = _illegal_bytecode_sequence; address lep = _illegal_bytecode_sequence; address fep = _illegal_bytecode_sequence; address dep = _illegal_bytecode_sequence; address vep = _unimplemented_bytecode; address wep = _unimplemented_bytecode; // code for short & wide version of bytecode if (Bytecodes::is_defined(code)) { Template* t = TemplateTable::template_for(code); assert(t->is_valid(), "just checking"); set_short_entry_points(t, bep, cep, sep, aep, iep, lep, fep, dep, vep); } if (Bytecodes::wide_is_defined(code)) { Template* t = TemplateTable::template_for_wide(code); assert(t->is_valid(), "just checking"); set_wide_entry_point(t, wep); } // set entry points EntryPoint entry(bep, zep, cep, sep, aep, iep, lep, fep, dep, vep); Interpreter::_normal_table.set_entry(code, entry); Interpreter::_wentry_point[code] = wep; } //... void TemplateInterpreterGenerator::set_short_entry_points(Template* t, address& bep, address& cep, address& sep, address& aep, address& iep, address& lep, address& fep, address& dep, address& vep) { assert(t->is_valid(), "template must exist"); switch (t->tos_in()) { case btos: case ztos: case ctos: case stos: ShouldNotReachHere(); // btos/ctos/stos should use itos. break; case atos: vep = __ pc(); __ pop(atos); aep = __ pc(); generate_and_dispatch(t); break; case itos: vep = __ pc(); __ pop(itos); iep = __ pc(); generate_and_dispatch(t); break; case ltos: vep = __ pc(); __ pop(ltos); lep = __ pc(); generate_and_dispatch(t); break; case ftos: vep = __ pc(); __ pop(ftos); fep = __ pc(); generate_and_dispatch(t); break; case dtos: vep = __ pc(); __ pop(dtos); dep = __ pc(); generate_and_dispatch(t); break; case vtos: set_vtos_entry_points(t, bep, cep, sep, aep, iep, lep, fep, dep, vep); break; default : ShouldNotReachHere(); break; } } //... void TemplateInterpreterGenerator::generate_and_dispatch(Template* t, TosState tos_out) { if (PrintBytecodeHistogram) histogram_bytecode(t); #ifndef PRODUCT // debugging code if (CountBytecodes || TraceBytecodes || StopInterpreterAt > 0) count_bytecode(); if (PrintBytecodePairHistogram) histogram_bytecode_pair(t); if (TraceBytecodes) trace_bytecode(t); if (StopInterpreterAt > 0) stop_interpreter_at(); __ verify_FPU(1, t->tos_in()); #endif // !PRODUCT int step = 0; if (!t->does_dispatch()) { step = t->is_wide() ? Bytecodes::wide_length_for(t->bytecode()) : Bytecodes::length_for(t->bytecode()); if (tos_out == ilgl) tos_out = t->tos_out(); // compute bytecode size assert(step > 0, "just checkin'"); // setup stuff for dispatching next bytecode if (ProfileInterpreter && VerifyDataPointer && MethodData::bytecode_has_profile(t->bytecode())) { __ verify_method_data_pointer(); } __ dispatch_prolog(tos_out, step); } // generate template t->generate(_masm); // advance if (t->does_dispatch()) { #ifdef ASSERT // make sure execution doesn't go beyond this point if code is broken __ should_not_reach_here(); #endif // ASSERT } else { // dispatch to next bytecode __ dispatch_epilog(tos_out, step); } } 

, . JVM. Java- . JavaCalls . JVM , main .



, , :


 public class Sum{ public static void sum(int a, int b){ return a + b; } } public class Main { public static void main(String args[]){ Sum.sum(2, 3); } } 

Sum.sum(II) .


2 javac -c *.java , .
Sum.sum :


  descriptor: (II)I flags: (0x0009) ACC_PUBLIC, ACC_STATIC Code: stack=2, locals=2, args_size=2 0: iload_0 1: iload_1 2: iadd 3: ireturn LineNumberTable: line 3: 0 

Main.main


  descriptor: ([Ljava/lang/String;)V flags: (0x0009) ACC_PUBLIC, ACC_STATIC Code: stack=2, locals=1, args_size=1 0: iconst_2 1: iconst_3 2: invokestatic #2 // Method Sum.sum:(II)I 5: pop 6: return LineNumberTable: line 13: 0 line 14: 6 

, тАФ .


invokestatic ' x86 - HotSpot


 void TemplateTable::invokestatic(int byte_no) { transition(vtos, vtos); assert(byte_no == f1_byte, "use this argument"); prepare_invoke(byte_no, rbx); // get f1 Method* // do the call __ profile_call(rax); __ profile_arguments_type(rax, rbx, rbcp, false); __ jump_from_interpreted(rbx, rax); } 

byte_no == f1_byte тАФ ConstantPoolCache , , rbx тАФ , Method * . : , , ( method_entry ).


prepare_invoke . , invokestatic ConstantPool Constant_Methodref_Info . HotSpot . 2 .. ConstantPoolCache . ConstantPoolCache , (, ConstantPoolCacheEntry , ). ConstantPoolCacheEntry , ( 0) / . , ConstantPool , ConstantPoolCache ( x86 Little Endian).


, , HotSpot prepare_invoke тАФ ConstantPoolCache . , , ConstantPoolCacheEntry


  __ get_cache_and_index_and_bytecode_at_bcp(Rcache, index, temp, byte_no, 1, index_size); __ cmpl(temp, code); // have we resolved this bytecode? __ jcc(Assembler::equal, resolved); // resolve first time through address entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_from_cache); __ movl(temp, code); __ call_VM(noreg, entry, temp); // Update registers with resolved info __ get_cache_and_index_at_bcp(Rcache, index, 1, index_size); __ bind(resolved); 

, InterpreterRuntime::resolve_from_cache .


receiver'a , . (, , , ConstantPoolCache <clinit> , ). define class, EagerInitialization ( , , :)). HotSpot ( CDS ) .


, , ConstantPoolCacheEntry . Method * rbx , , .


Sum.sum(2, 3) . gdb-script sum.gdb :


 #    java file /home/dmitrii/jdk12/build/linux-x86_64-server-fastdebug/images/jdk/bin/java # gdb    SEGV' #,   https://hg.openjdk.java.net/jdk/jdk12/file/06222165c35f/src/hotspot/cpu/x86/vm_version_x86.cpp#l361 handle SIGSEGV nostop noprint #       set breakpoint pending on #    , #    set pagination off #      main b PostJVMInit commands #   , #    set $buffer = malloc(1000) #   . #jmp       # invokestatic b *AbstractInterpreter::_entry_table[0] thread 2 commands #     invokestatic, # Method*   rbx set $mthd = (Method *) $rbx #    $buffer call $mthd->name_and_sig_as_C_string($buffer, 1000) if strcmp()($buffer, "Sum.sum(II)I") == 0 #  iload_0,     b *TemplateInterpreter::_normal_table._table[vtos][26] thread 2 #  iload_1,   - int,  #  iload_0 b *TemplateInterpreter::_normal_table._table[itos][27] thread 2 #   iadd b *TemplateInterpreter::_normal_table._table[itos][96] thread 2 end c end c end r -cp . Main 

gdb -x sum.gdb , Sum.sum


 $453 = 0x7ffff7fdcdd0 "Sum.sum(II)I" 

layout asm , , generate_normal_entry . -, StackOverflow, stack-banging dispatch iload_0 . :


 0x7fffd828fa1f mov eax,DWORD PTR [r14] ;, iload_0 0x7fffd828fa22 movzx ebx,BYTE PTR [r13+0x1] ;   0x7fffd828fa27 inc r13 ; bcp (byte code pointer) 0x7fffd828fa2a movabs r10,0x7ffff717e8a0 ; DispatchTable 0x7fffd828fa34 jmp QWORD PTR [r10+rbx*8] ;jump      

rax ,


 0x7fffd828fabe push rax ;     ;   ,      0x7fffd828fabf mov eax,DWORD PTR [r14-0x8] 0x7fffd828fac3 movzx ebx,BYTE PTR [r13+0x1] 0x7fffd828fac8 inc r13 0x7fffd828facb movabs r10,0x7ffff717e8a0 0x7fffd828fad5 jmp QWORD PTR [r10+rbx*8] 

iadd :


 0x7fffd8292ba7 mov edx,DWORD PTR [rsp] ; ,     iload_1 0x7fffd8292baa add rsp,0x8 ; rsp    0x7fffd8292bae add eax,edx ;   0x7fffd8292bb0 movzx ebx,BYTE PTR [r13+0x1] 0x7fffd8292bb5 inc r13 0x7fffd8292bb8 movabs r10,0x7ffff717e8a0 0x7fffd8292bc2 jmp QWORD PTR [r10+rbx*8] 

gdb eax edx ,


 (gdb) p $eax $457 = 3 (gdb) p $edx $458 = 2 

, Sum.sum .

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


All Articles