
рд╣реЙрдЯрд╕реНрдкреЙрдЯ JVM рдореЗрдВ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдореЗрдВ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдЗрд╕реЗ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ:
PrintGC
,
PrintCompilation
,
TraceClassLoading
, рдЖрджрд┐ред рдЖрдорддреМрд░ рдкрд░, рдЙрдиреНрд╣реЗрдВ рдХрдорд╛рдВрдб-рд▓рд╛рдЗрди рд╡рд┐рдХрд▓реНрдкреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
-XX:+PrintGCDetails
ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХрднреА-рдХрднреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдСрдкрд░реЗрд╢рди рдХреЗ рджреМрд░рд╛рди рд╕реАрдзреЗ рдЗрд╕ рдзреНрд╡рдЬ рдХреЛ рд╕рдХреНрд╖рдо рдпрд╛ рдЕрдХреНрд╖рдо рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдм рдЕрдиреНрдп рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдЬреЗрд╡реАрдПрдо рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдирд┐рдпрдорд┐рдд рдФрд░ рд╣реИрдХрд░ рджреЛрдиреЛрдВ рддрд░реАрдХреЛрдВ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдмрд╛рдж рд╡рд╛рд▓рд╛ рдЕрдзрд┐рдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рджреЛрдиреЛрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рджреЛрдиреЛрдВ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИрдВред
рдЗрд╕ рд▓реЗрдЦ рд╕реЗ рдЖрдк рд╕реАрдЦреЗрдВрдЧреЗ:
- рдЬрд╣рд╛рдБ рд╕рднреА JVM рдЭрдВрдбреЗ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ рд╡реЗ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реИрдВ;
- JMX рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдлреНрд▓реИрдЧ рдХреИрд╕реЗ рдкрдврд╝реЗрдВ рдпрд╛ рд╕реЗрдЯ рдХрд░реЗрдВ;
- рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдХреА рд╕реНрдореГрддрд┐ рдореЗрдВ рд╕рд╣реА рдХреНрд╖реЗрддреНрд░ рдХреИрд╕реЗ рдЦреЛрдЬреЗрдВ рдФрд░ рдЗрд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВред
рд╣реЙрдЯрд╕реНрдкреЙрдЯ рдЬреЗрд╡реАрдПрдо рдореЗрдВ рдЭрдВрдбреЗ рдХреНрдпрд╛ рд╣реИрдВ
рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд╕рд╛рде рд╕рднреА рдЭрдВрдбреЗ рдХреА рдПрдХ рд╕реВрдЪреА 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 рдбрд╛рдпрд░реЗрдХреНрдЯ рдореЗрдореЛрд░реА рдПрдХреНрд╕реЗрд╕
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, JMX рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рд╕реЗрдЯ рдЫреЛрдЯрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЬреЗрд╡реАрдПрдо рдХреЗ рдЭрдВрдбреЗ рд╕рд┐рд░реНрдл рд╕рд╛рдзрд╛рд░рдг рдЪрд░ рд╣реИрдВ рдЬреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрддрд╛ рд╕реНрдерд╛рди рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИрдВред рдпрджрд┐ рдЖрдк рдПрдХ рдЪрд░ рдХрд╛ рдкрддрд╛ рдЬрд╛рдирддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ
Unsafe API рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдирдпрд╛ рдорд╛рди рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдЬреЗрд╡реАрдПрдо рдХреЗ рдЭрдВрдбреЗ рдХрд╛ рдкрддрд╛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИред рдХрд╛рд░реНрдп рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд▓реЙрдиреНрдЪ рд╕реЗ рд▓реЙрдиреНрдЪ рддрдХ, рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреА рдЗрдЪреНрдЫрд╛ рдкрд░ рдкрддрд╛ рдмрджрд▓ рдЬрд╛рдПрдЧрд╛ред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рд▓рд┐рдирдХреНрд╕ рдПрдХ рдмрд╣реБрдд рд╣реА рдорд┐рд▓рдирд╕рд╛рд░ рдУрдПрд╕ рд╣реИ, рдФрд░ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкреВрдЫреЗ рдЬрд╛рдиреЗ рдкрд░ рд╣рдореЗрдВ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреАред
- рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐
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(); } }
- рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХреНрд╖рдг
libjvm.so
: рд╣рдо libjvm.so
рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП libjvm.so
ред рд╣рдорд╛рд░реЗ рдУрдкрди-рд╕реЛрд░реНрд╕ рдИрдПрд▓рдПрдл рдкрд╛рд░реНрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ , рд╣рдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдкреНрд░рддреАрдХ рдЦрдВрдб рдкрд╛рддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рд╕рднреА рдЬреЗрд╡реАрдПрдо рдЭрдВрдбреЗ рдкреНрд░рддреАрдХреЛрдВ рдХреЗ рдмреАрдЪ рдореМрдЬреВрдж рд╣реИрдВред рдлрд┐рд░ рд╕реЗ, рдХреЛрдИ рд╣реИрдХ рдирд╣реАрдВ, рдХреЗрд╡рд▓ рд╢реБрджреНрдз рдЬрд╛рд╡рд╛ред
ElfReader elfReader = new ElfReader(jvmLibrary); ElfSymbolTable symtab = (ElfSymbolTable) elfReader.section(".symtab");
- рдЪрд░рдг 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 рд╢рд╛рдорд┐рд▓ рд╣реИред