рд╣рдо рдЬреЗрд╡реАрдПрдо рдХреА рдпрд╛рдж рдореЗрдВ рдЦреБрджрд╛рдИ рдХрд░рддреЗ рд╣реИрдВред рдЭрдВрдбреЗ рдХреА рд╣реЗрд░рдлреЗрд░



рд╣реЙрдЯрд╕реНрдкреЙрдЯ JVM рдореЗрдВ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдореЗрдВ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдЗрд╕реЗ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ: PrintGC , PrintCompilation , TraceClassLoading , рдЖрджрд┐ред рдЖрдорддреМрд░ рдкрд░, рдЙрдиреНрд╣реЗрдВ рдХрдорд╛рдВрдб-рд▓рд╛рдЗрди рд╡рд┐рдХрд▓реНрдкреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, -XX:+PrintGCDetails ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХрднреА-рдХрднреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдСрдкрд░реЗрд╢рди рдХреЗ рджреМрд░рд╛рди рд╕реАрдзреЗ рдЗрд╕ рдзреНрд╡рдЬ рдХреЛ рд╕рдХреНрд╖рдо рдпрд╛ рдЕрдХреНрд╖рдо рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдм рдЕрдиреНрдп рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдЬреЗрд╡реАрдПрдо рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдирд┐рдпрдорд┐рдд рдФрд░ рд╣реИрдХрд░ рджреЛрдиреЛрдВ рддрд░реАрдХреЛрдВ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдмрд╛рдж рд╡рд╛рд▓рд╛ рдЕрдзрд┐рдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рджреЛрдиреЛрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рджреЛрдиреЛрдВ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИрдВред

рдЗрд╕ рд▓реЗрдЦ рд╕реЗ рдЖрдк рд╕реАрдЦреЗрдВрдЧреЗ:




рд╣реЙрдЯрд╕реНрдкреЙрдЯ рдЬреЗрд╡реАрдПрдо рдореЗрдВ рдЭрдВрдбреЗ рдХреНрдпрд╛ рд╣реИрдВ


рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд╕рд╛рде рд╕рднреА рдЭрдВрдбреЗ рдХреА рдПрдХ рд╕реВрдЪреА OpenJDK рд╕реНрд░реЛрддреЛрдВ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИ: рдЧреНрд▓реЛрдмрд▓реНрд╕ рдореЗрдВ рдореБрдЦреНрдп рд╣рд┐рд╕реНрд╕рд╛ред рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ , рдХрдВрдкрд╛рдЗрд▓рд░ рдФрд░ рдЬреА 1 рдХрд▓реЗрдХреНрдЯрд░ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд╕рд╛рдеред

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЭрдВрдбреЗ рд╡рд┐рднрд┐рдиреНрди рдореИрдХреНрд░реЛ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВ:


JVM рдХреЗ рдЖрдкрдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╕рднреА рдЭрдВрдбреЗ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрдирдХреЗ рд╡рд░реНрддрдорд╛рди рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде, рдЖрдкрдХреЛ PrintFlagsFinal рдХреЛ PrintFlagsFinal рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдЪрд▓рд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:
 java -XX:+PrintFlagsFinal 


рдЬреЗрдПрдордПрдХреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЭрдВрдбреЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ


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

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдПрдХ MXBean рдЙрджрд╛рд╣рд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдирд╛рдо com.sun.management:type=HotSpotDiagnostic ред
 import com.sun.management.HotSpotDiagnosticMXBean; import java.lang.management.ManagementFactory; import javax.management.MBeanServer; ... MBeanServer server = ManagementFactory.getPlatformMBeanServer(); HotSpotDiagnosticMXBean bean = ManagementFactory.newPlatformMXBeanProxy( server, "com.sun.management:type=HotSpotDiagnostic", HotSpotDiagnosticMXBean.class); 


bean.getVMOption(String option) рд╡рд┐рдзрд┐ рдЖрдкрдХреЛ JVM рд╡рд┐рдХрд▓реНрдк рдХрд╛ рд╡рд░реНрддрдорд╛рди рдорд╛рди bean.getVMOption(String option) ,
рдФрд░ bean.setVMOption(String option, String newValue) - рдПрдХ рдирдпрд╛ рд╕реЗрдЯ рдХрд░реЗрдВред
рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рднреА рдзреНрд╡рдЬ рдХреЛ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдХреЗрд╡рд▓ manageable рдХреЛ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
bean.getDiagnosticOptions() рд╡рд┐рдзрд┐ рд╕рднреА manageable рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рд╕реВрдЪреА bean.getDiagnosticOptions() ред

рдПрдХ рдЙрджрд╛рд╣рд░рдг:
 //   JVM,    ReentrantLock  ..  thread dump bean.setVMOption("PrintConcurrentLocks", "true"); 


JVM рдбрд╛рдпрд░реЗрдХреНрдЯ рдореЗрдореЛрд░реА рдПрдХреНрд╕реЗрд╕


рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, JMX рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рд╕реЗрдЯ рдЫреЛрдЯрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЬреЗрд╡реАрдПрдо рдХреЗ рдЭрдВрдбреЗ рд╕рд┐рд░реНрдл рд╕рд╛рдзрд╛рд░рдг рдЪрд░ рд╣реИрдВ рдЬреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрддрд╛ рд╕реНрдерд╛рди рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИрдВред рдпрджрд┐ рдЖрдк рдПрдХ рдЪрд░ рдХрд╛ рдкрддрд╛ рдЬрд╛рдирддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ Unsafe API рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдирдпрд╛ рдорд╛рди рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдЬреЗрд╡реАрдПрдо рдХреЗ рдЭрдВрдбреЗ рдХрд╛ рдкрддрд╛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИред рдХрд╛рд░реНрдп рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд▓реЙрдиреНрдЪ рд╕реЗ рд▓реЙрдиреНрдЪ рддрдХ, рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреА рдЗрдЪреНрдЫрд╛ рдкрд░ рдкрддрд╛ рдмрджрд▓ рдЬрд╛рдПрдЧрд╛ред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рд▓рд┐рдирдХреНрд╕ рдПрдХ рдмрд╣реБрдд рд╣реА рдорд┐рд▓рдирд╕рд╛рд░ рдУрдПрд╕ рд╣реИ, рдФрд░ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкреВрдЫреЗ рдЬрд╛рдиреЗ рдкрд░ рд╣рдореЗрдВ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреАред

  1. рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ libjvm.so рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╣рд╛рдБ libjvm.so , рдФрд░ рдЗрд╕реЗ рдХрд┐рд╕ рдкрддреЗ рдкрд░ рд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЦрд░реАрдж рд╡рд░реНрдЪреБрдЕрд▓ рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдлрд╝рд╛рдЗрд▓ /proc/self/maps рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛, рдЬреЛ рд╡рд░реНрддрдорд╛рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╡рд░реНрдЪреБрдЕрд▓ рдПрдбреНрд░реЗрд╕ рд╕реНрдкреЗрд╕ рдХреЗ рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рддрд╛ рд╣реИред рд╣рдо рдЗрд╕реЗ /libjvm.so рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд░реЗрдЦрд╛ /libjvm.so ред
     2b6707956000-2b67084b8000 r-xp 00000000 68:02 1823284 /usr/java/jdk1.7.0_40/jre/lib/amd64/server/libjvm.so 

    рдкрд╣рд▓рд╛ рдирдВрдмрд░ (0x2b6707956000) рдЖрдзрд╛рд░ рдкрддрд╛ рд╣реЛрдЧрд╛ рдЬрд┐рд╕ рдкрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд▓реЛрдб рд╣реИред

    рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рд╕рдм рд╢реБрджреНрдз рдЬрд╛рд╡рд╛ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ!
     private String findJvmMaps() throws IOException { BufferedReader reader = new BufferedReader(new FileReader("/proc/self/maps")); try { for (String s; (s = reader.readLine()) != null; ) { if (s.endsWith("/libjvm.so")) { return s; } } throw new IOException("libjvm.so not found"); } finally { reader.close(); } } 

  2. рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХреНрд╖рдг libjvm.so : рд╣рдо libjvm.so рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП libjvm.so ред рд╣рдорд╛рд░реЗ рдУрдкрди-рд╕реЛрд░реНрд╕ рдИрдПрд▓рдПрдл рдкрд╛рд░реНрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ , рд╣рдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдкреНрд░рддреАрдХ рдЦрдВрдб рдкрд╛рддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рд╕рднреА рдЬреЗрд╡реАрдПрдо рдЭрдВрдбреЗ рдкреНрд░рддреАрдХреЛрдВ рдХреЗ рдмреАрдЪ рдореМрдЬреВрдж рд╣реИрдВред рдлрд┐рд░ рд╕реЗ, рдХреЛрдИ рд╣реИрдХ рдирд╣реАрдВ, рдХреЗрд╡рд▓ рд╢реБрджреНрдз рдЬрд╛рд╡рд╛ред
     ElfReader elfReader = new ElfReader(jvmLibrary); ElfSymbolTable symtab = (ElfSymbolTable) elfReader.section(".symtab"); 

  3. рдЪрд░рдг 1 рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдЖрдзрд╛рд░ рдкрддреЗ рдХреЛ рдкреНрд░рддреАрдХ рдкрддреЗ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ, рдФрд░ рдЙрд╕ рдореЗрдореЛрд░реА рдореЗрдВ рд╡рд╛рдВрдЫрд┐рдд рд╕реНрдерд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдЬрд╣рд╛рдВ рдзреНрд╡рдЬ рдорд╛рди рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИрдВред рдЕрдм рд╣рдо рдЗрд╕реЗ Unsafe.putInt рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ:
     private ElfSymbol findSymbol(String name) { for (ElfSymbol symbol : symtab) { if (name.equals(symbol.name()) && symbol.type() == ElfSymbol.STT_OBJECT) { return symbol; } } throw new NoSuchElementException("Symbol not found: " + name); } public void setIntFlag(String name, int value) { ElfSymbol symbol = findSymbol(name); unsafe.putInt(baseAddress + symbol.value(), value); } public void setBooleanFlag(String name, boolean value) { setIntFlag(name, value ? 1 : 0); } 



рдирд┐рд╖реНрдХрд░реНрд╖


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

рдкреНрд░рдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдг рд╕реНрд░реЛрдд рдХреЛрдб GitHub рдкрд░ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред

рдпрджрд┐ рдЖрдк рдЕрдзрд┐рдХ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╕реЗрдВрдЯ рдкреАрдЯрд░реНрд╕рдмрд░реНрдЧ рдореЗрдВ 15 рдЕрдХреНрдЯреВрдмрд░ рдХреЛ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдЬреЛрдХрд░ рдЬрд╛рд╡рд╛ рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХреА рд╕рдореНрдореЗрд▓рди рдореЗрдВ рдЖрдПрдВред Odnoklassniki рд╕реЗ рддреАрди рд░рд┐рдкреЛрд░реНрдЯ рдкреНрд░рд╕реНрддреБрдд рдХреА рдЬрд╛рдПрдЧреА, рдЬрд┐рд╕рдореЗрдВ JVM рд╢рд╛рдорд┐рд▓ рд╣реИред

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


All Articles