ãã©ãããã©ãŒã MBeanãµãŒããŒãšãã©ãããã©ãŒã MXBeanã®äœ¿çš
ãã®ç« ã§ã¯ãJava Platform, Standard Edition (Java SEãã©ãããã©ãŒã )ã®äžéšãšããŠæäŸãããMBeanãµãŒããŒãšMXBeanã«ã€ããŠèª¬æããŸããMBeanãµãŒããŒãšMXBeanã¯ãã¢ãã¿ãªã³ã°ããã³ç®¡çã®ç®çã§äœ¿çšã§ããŸãã Java Management Extensions (JMX)ãã¯ãããžã®MBeanãšMBeanãµãŒããŒã«ã€ããŠã¯ã第1ç« ãJava SEã¢ãã¿ãªã³ã°ããã³ç®¡çã®æŠèŠãã«æŠèŠãèšãããŠããŸãã JMXãã¯ãããžã«ã€ããŠã¯ãJava SEãã©ãããã©ãŒã ã®JMXãã¯ãããžã®ããã¥ã¡ã³ãã«è©³ãã説æãããŠããŸãã
ãã©ãããã©ãŒã MBeanãµãŒããŒã®äœ¿çš
MBeanãµãŒããŒã¯ã管çã¢ããªã±ãŒã·ã§ã³ããMBeanã«ã¢ã¯ã»ã¹ã§ããããã«ããMBeanã®ãªããžããªã§ãã ã¢ããªã±ãŒã·ã§ã³ã¯ãMBeanã«çŽæ¥ã¢ã¯ã»ã¹ããŸãããããã®äžæã®ObjectNameãä»ããŠãMBeanãµãŒããŒçµç±ã§MBeanã«ã¢ã¯ã»ã¹ããŸãã MBeanãµãŒããŒã«ã¯ãã€ã³ã¿ãã§ãŒã¹javax.management.MBeanServerãå®è£ ãããŠããŸãã
ãã©ãããã©ãŒã MBeanãµãŒããŒãšã¯ãJava SE 5.0ã§å°å ¥ããããã®ã§ãJavaä»®æ³ãã·ã³(Java VM)ã«çµã¿èŸŒãŸããMBeanãµãŒããŒã®ããšã§ãã ãã©ãããã©ãŒã MBeanãµãŒããŒã¯ãJava VMã§å®è¡ãããçŸåšç®¡çäžã«ãããã¹ãŠã®ã³ã³ããŒãã³ãã§å ±æã§ããŸãã java.lang.management.ManagementFactoryã®ã¡ãœããgetPlatformMBeanServerã䜿çšããŠããã©ãããã©ãŒã MBeanãµãŒããŒã«ã¢ã¯ã»ã¹ããŸãã ãã¡ããjavax.management.MBeanServerFactoryã¯ã©ã¹ã䜿çšããŠç¬èªã®MBeanãµãŒããŒãæ§ç¯ããããšãã§ããŸãã ãã ããéåžžãMBeanãµãŒããŒãè€æ°ååšããå¿ èŠã¯ãªãããããã©ãããã©ãŒã MBeanãµãŒããŒã®äœ¿çšããèŠãããŸãã
ãã©ãããã©ãŒã MXBeanãžã®ã¢ã¯ã»ã¹
ãã©ãããã©ãŒã MXBeanã¯ãJava VMã®ã¢ãã¿ãªã³ã°ããã³ç®¡çã宿œããMBeanã§ãã åMXBeanã§ã¯ãVMæ©èœã®äžéšãã«ãã»ã«åããŸãã 第 1ç« ãJava SEã¢ãã¿ãªã³ã°ããã³ç®¡çã®æŠèŠãã®è¡š 1-1ã«ãã©ãããã©ãŒã ã§æäŸããMXBeanããã¹ãŠäžèЧã§ç€ºããŠããŸãã
管çã¢ããªã±ãŒã·ã§ã³ã§ã¯ã次ã®3çš®é¡ã®æ¹æ³ã§ããã©ãããã©ãŒã MXBeanã«ã¢ã¯ã»ã¹ã§ããŸãã
-
çŽæ¥ã¢ã¯ã»ã¹(ManagementFactoryã¯ã©ã¹çµç±)ã
-
çŽæ¥ã¢ã¯ã»ã¹(MXBeanãããã·çµç±)ã
-
鿥ã¢ã¯ã»ã¹(MBeanServerConnectionã¯ã©ã¹çµç±)ã
次ã®3ã€ã®ã»ã¯ã·ã§ã³ã§ã¯ããã©ãããã©ãŒã MXBeanãžã®ããã3çš®é¡ã®ã¢ã¯ã»ã¹æ¹æ³ã«ã€ããŠèª¬æããŸãã
ManagementFactoryã¯ã©ã¹ã䜿çšãããã©ãããã©ãŒã MXBeanãžã®ã¢ã¯ã»ã¹
ã¢ããªã±ãŒã·ã§ã³ã¯ãèªèº«ã®Java VMãšåäžJava VMã§çšŒåãããã©ãããã©ãŒã MXBeanã®ã¡ãœããã«å¯ŸããŠçŽæ¥åŒåºããè¡ãããšãã§ããŸãã çŽæ¥åŒåºãã«ã¯ãManagementFactoryã¯ã©ã¹ã®staticã¡ãœããã䜿çšã§ããŸãã ManagementFactoryã«ã¯ãgetClassLoadingMXBean()ãgetGarbageCollectorMXBeans()ãgetRuntimeMXBean()ãªã©ã®ããŸããŸãªãã©ãããã©ãŒã MXBeanã«ãããã察å¿ããã¢ã¯ã»ã¹çšã¡ãœãããçšæãããŠããŸãã ãã©ãããã©ãŒã MXBeanãè€æ°ååšããå Žåããã®ã¡ãœããã¯æ€åºãããã©ãããã©ãŒã MXBeanã®ãªã¹ããè¿ããŸãã
ããšãã°ãäŸ 4-1ã§ã¯ãManagementFactoryã®staticã¡ãœããã䜿çšããŠãã©ãããã©ãŒã MXBeanã®RuntimeMXBeanãååŸããããã«ãã©ãããã©ãŒã MXBeanãããã³ããŒåãååŸããŸãã
äŸ 4-1 ManagementFactoryã¯ã©ã¹ãçµç±ãããã©ãããã©ãŒã MXBeanãžã®ã¢ã¯ã»ã¹RuntimeMXBean mxbean = ManagementFactory.getRuntimeMXBean(); String vendor = mxbean.getVmVendor();
MXBeanãããã·ãçµç±ãããã©ãããã©ãŒã MXBeanãžã®ã¢ã¯ã»ã¹
ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãMXBeanãããã·ãä»ããŠãã©ãããã©ãŒã MXBeanã¡ãœãããåŒã³åºãããšãã§ããŸãã ãããè¡ãã«ã¯ãstaticã¡ãœããManagementFactory.newPlatformMXBeanProxy()ãåŒã³åºããŠãæå®ãããMBeanãµãŒããŒã«ã¡ãœããã®åŒåºãã転éããMXBeanãããã·ã»ã€ã³ã¹ã¿ã³ã¹ã®äœæãå¿ èŠãšãªããŸãã ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãéåžžå¥ã®Java VMã®ãã©ãããã©ãŒã MXBeanã«å¯Ÿãããªã¢ãŒãã»ã¢ã¯ã»ã¹ãå¯èœãšãããããã·ãäœæããŸãã
ããšãã°ãäŸ 4-2ã§ã¯ãäŸ 4-1ãšãŸã£ããåãåŠçãå®è¡ããŸãããä»åã¯MXBeanãããã·ã䜿çšããŸãã
äŸ 4-2 MXBeanãããã·ãçµç±ãããã©ãããã©ãŒã MXBeanãžã®ã¢ã¯ã»ã¹
MBeanServerConnection mbs;
...
// Get a MBean proxy for RuntimeMXBean interface
RuntimeMXBean proxy =
ManagementFactory.newPlatformMXBeanProxy(mbs,
ManagementFactory.RUNTIME_MXBEAN_NAME,
RuntimeMXBean.class);
// Get standard attribute "VmVendor"
String vendor = proxy.getVmVendor();
MBeanServerConnectionã¯ã©ã¹ã䜿çšãããã©ãããã©ãŒã MXBeanãžã®ã¢ã¯ã»ã¹
ã¢ããªã±ãŒã·ã§ã³ã¯ãå¥ã®å®è¡äžã®Java VMã®ãã©ãããã©ãŒã MBeanãµãŒããŒã«æ¥ç¶ãããŠããMBeanServerConnectionãçµç±ããŠãã©ãããã©ãŒã MXBeanã¡ãœããã鿥çã«åŒã³åºãããšãã§ããŸãã MBeanServerConnectionã¯ã©ã¹ã®getAttribute()ã¡ãœããã䜿çšããŠãã©ãããã©ãŒã MXBeanã®å±æ§ãååŸããMBeanã®ObjectNameãšå±æ§åããã©ã¡ãŒã¿ãšããŠæå®ããŸãã
ããšãã°ãäŸ 4-3ã§ã¯ãäŸ 4-1ããã³äŸ 4-2ãšåããžã§ããå®è¡ããŸãããMBeanServerConnectionãä»ããŠéæ¥çãªåŒåºããè¡ããŸãã
äŸ 4-3 MBeanServerConnectionã¯ã©ã¹ãçµç±ãããã©ãããã©ãŒã MXBeanãžã®ã¢ã¯ã»ã¹
MBeanServerConnection mbs;
...
try {
ObjectName oname = new ObjectName(ManagementFactory.RUNTIME_MXBEAN_NAME);
// Get standard attribute "VmVendor"
String vendor = (String) mbs.getAttribute(oname, "VmVendor");
} catch (....) {
// Catch the exceptions thrown by ObjectName constructor
// and MBeanServer.getAttribute method
...
}
Oracle JDKã®ãã©ãããã©ãŒã æ¡åŒµæ©èœã®äœ¿çš
Java VMã§ã¯ããã©ãããã©ãŒã ã«ç¹åããæž¬å®ã«å¿ èŠãªã€ã³ã¿ãã§ãŒã¹ãšç®¡çæäœãå®çŸ©ããããšã«ãã管çã€ã³ã¿ãã§ãŒã¹ãæ¡åŒµã§ããŸãã ManagementFactoryã¯ã©ã¹ã®staticãã¡ã¯ããªã»ã¡ãœããã¯ããã©ãããã©ãŒã æ¡åŒµæ©èœãåããMBeanãè¿ããŸãã
com.sun.managementããã±ãŒãžã«ã¯ãOracle JDKã®ãã©ãããã©ãŒã æ¡åŒµæ©èœãå«ãŸããŠããŸãã æ¬¡ã®åã»ã¯ã·ã§ã³ã§ã¯ãOracle JDKã®OperatingSystemMXBeanå®è£ ãããã©ãããã©ãŒã åºæã®å±æ§ã«ã¢ã¯ã»ã¹ããæ¹æ³ã®äŸã«ã€ããŠèª¬æããŸãã
MXBeanã®åçš®å±æ§ã«å¯ŸããçŽæ¥ã¢ã¯ã»ã¹
äŸ4-4ã§ã¯ãOracle JDKã®MXBeanã€ã³ã¿ãã§ãŒã¹ã®1ã€ã«å¯ŸããŠçŽæ¥ã¢ã¯ã»ã¹ãè¡ã£ãŠããŸãã
äŸ 4-4 MXBean屿§ã«å¯ŸããçŽæ¥ã¢ã¯ã»ã¹com.sun.management.OperatingSystemMXBean mxbean = (com.sun.management.OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean(); // Get the number of processors int numProcessors = mxbean.getAvailableProcessors(); // Get the Oracle JDK-specific attribute Process CPU time long cpuTime = mxbean.getProcessCpuTime();
MBeanServerConnectionçµç±ã«ããMXBean屿§ãžã®ã¢ã¯ã»ã¹
äŸ4-5ã§ã¯ãOracle JDKã®MXBeanã€ã³ã¿ãã§ãŒã¹ã®1ã€ã«MBeanServerConnectionã¯ã©ã¹çµç±ã§ã¢ã¯ã»ã¹ããŸãã
äŸ 4-5 MBeanServerConnectionãçµç±ããMXBean屿§ãžã®ã¢ã¯ã»ã¹
MBeanServerConnection mbs;
// Connect to a running Java VM (or itself) and get MBeanServerConnection
// that has the MXBeans registered in it
...
try {
// Assuming the OperatingSystem MXBean has been registered in mbs
ObjectName oname = new ObjectName(ManagementFactory.OPERATING_SYSTEM_MXBEAN_NAME);
// Get standard attribute "Name"
String vendor = (String) mbs.getAttribute(oname, "Name");
// Check if this MXBean contains Oracle JDK's extension
if (mbs.isInstanceOf(oname, "com.sun.management.OperatingSystemMXBean")) {
// Get platform-specific attribute "ProcessCpuTime"
long cpuTime = (Long) mbs.getAttribute(oname, "ProcessCpuTime");
}
} catch (....) {
// Catch the exceptions thrown by ObjectName constructor
// and MBeanServer methods
...
}
ã¹ã¬ããã®ç«¶åããã³CPUæéã®ã¢ãã¿ãªã³ã°
ãã©ãããã©ãŒã MXBeanã®ThreadMXBeanã§ã¯ãã¹ã¬ããã®ç«¶åãšã¹ã¬ããã®CPUæéã®ã¢ãã¿ãªã³ã°ããµããŒãããŸãã
Oracle JDKã®HotSpot VMã§ã¯ãã¹ã¬ããã®ç«¶åã®ã¢ãã¿ãªã³ã°ããµããŒãããŠããŸãã Java VMã§ã¹ã¬ããã®ç«¶åã®ã¢ãã¿ãªã³ã°ããµããŒããããŠãããã©ããã倿ããã«ã¯ãThreadMXBean.isThreadContentionMonitoringSupported()ã¡ãœããã䜿çšããŸãã ããã©ã«ãæã¯ãã¹ã¬ããã®ç«¶åã®ã¢ãã¿ãªã³ã°ãç¡å¹ã«ãªã£ãŠããŸãã æå¹ã«ããã«ã¯ãsetThreadContentionMonitoringEnabled()ã¡ãœããã䜿çšããŸãã
Oracle JDKã®HotSpot VMã§ã¯ãã»ãšãã©ã®ãã©ãããã©ãŒã ã«ãããŠã¹ã¬ããã®CPUæéã®æž¬å®ããµããŒãããŠããŸãã ãã®ã€ã³ã¿ãã§ãŒã¹ã§çºçããCPUæéã¯ããã®åäœã®ç²ŸåºŠãããç§ãšãªã£ãŠããŸãããããã§ã¯ããã»ã©ã®ç²ŸåºŠã¯èŠæ±ãããŸããã
Java VMãã©ã®ã¹ã¬ããã®CPUæéã®æž¬å®ããµããŒãããŠããããšã倿ããã«ã¯ãisThreadCpuTimeSupported()ã¡ãœããã䜿çšããŸãã Java VMã§çŸã¹ã¬ããã®CPUæéãæž¬å®ã§ãããã©ããã倿ããã«ã¯ãisCurrentThreadCpuTimeSupported()ã䜿çšããŸãã ã¹ã¬ããã®CPUæéã®æž¬å®ããµããŒãããJava VMã§ã¯ãçŸã¹ã¬ããã®CPUæéããµããŒãããŸãã
Java VMã§ã¯ãã¹ã¬ããã®CPUæéã®æž¬å®ãç¡å¹ã«ããããšãã§ããŸãã ã¹ã¬ããã®CPUæéã®æž¬å®ãæå¹ã«ããã«ã¯ãisThreadCpuTimeEnabled()ã¡ãœããã䜿çšããŸãã ã¹ã¬ããã®CPUæéã®æž¬å®ãæå¹/ç¡å¹ã«ããã«ã¯ãsetThreadCpuTimeEnabled()ã¡ãœããã䜿çšããŸãã
ãªãã¬ãŒãã£ã³ã°ã»ã·ã¹ãã ã®ç®¡ç
ãã©ãããã©ãŒã MXBeanã®OperatingSystemã§ã¯ã次ã«ç€ºããããªç¹å®ã®ãªãã¬ãŒãã£ã³ã°ã»ã·ã¹ãã ã®ãªãœãŒã¹æ å ±ã«ã¢ã¯ã»ã¹ããããšãã§ããŸãã
-
ããã»ã¹CPUæéã
-
ç©çã¡ã¢ãªãŒã®ç·å®¹éãšç©ºã容éã
-
ä»®æ³ã¡ã¢ãªãŒã®ç¢ºå®å®¹é(ããã»ã¹ã®å®è¡ã«äœ¿çšå¯èœãªä»®æ³ã¡ã¢ãªãŒã®å®¹é)ã
-
ã¹ã¯ãã空éã®ç·å®¹éããã³ç©ºã容éã
-
éããŠãããã¡ã€ã«èšè¿°åã®æ°(SolarisãLinuxãŸãã¯Mac OS Xãã©ãããã©ãŒã ã®ã¿)ã
JConsoleã®ãMBeanãã¿ãã§ãªãã¬ãŒãã£ã³ã°ã»ã·ã¹ãã ã®MXBeanãéžæãããšããã®ãã©ãããã©ãŒã ã®æ¡åŒµæ©èœãå«ããã¹ãŠã®å±æ§ãšåäœã衚瀺ãããŸãã æ°å€å±æ§ã®å€ãã£ãŒã«ããããã«ã¯ãªãã¯ããããšã«ããããã®æ°å€å±æ§ã®é·æã«ãããå€ã®å€åãã¢ãã¿ãŒã§ããŸãã
ãã®ã³ã°ã®ç®¡ç
Java SEãã©ãããã©ãŒã ã§ã¯ããã®ã³ã°ãç®çãšããç¹æ®ãªMXBean (LoggingMXBeanã€ã³ã¿ãã§ãŒã¹)ãæäŸããŸãã
LoggingMXBeanã§ã¯ã次ã®ã¿ã¹ã¯ãå®è¡ã§ããŸãã
-
æå®ãããã¬ãŒãšé¢é£ä»ããããŠãããã°ã»ã¬ãã«ã®ååãååŸã
-
çŸåšç»é²æžã¿ã®ãã¬ãŒã®ãªã¹ããååŸã
-
æå®ãããã¬ãŒã®èŠªã®ååãååŸã
-
æå®ã®æ°ããã¬ãã«ã«æå®ã®ãã¬ãŒãèšå®ã
LoggingMXBeanã®äžæã®ObjectNameã¯ãjava.util.logging:type=Loggingã§ãã ãã®ãªããžã§ã¯ãåã¯ãLogManager.LOGGING_MXBEAN_NAMEã«ä¿åãããŠããŸãã
LogManager.getLoggingMXBean()ã®åŒåºãã«ããååŸãå¯èœãªåäžã®ã°ããŒãã«ã»ã€ã³ã¹ã¿ã³ã¹LoggingMXBeanãçšæãããŠããŸãã
MXBeanã®Loggingã§ã¯ããã¬ãŒåã®ãªã¹ãã説æããLoggerNames屿§ãå®çŸ©ããŸãã 䜿çšäžã®ã¢ããªã±ãŒã·ã§ã³ã§ãã¬ãŒã®ãªã¹ããæ€åºããã«ã¯ããMBeanãã¿ãã§java.util.loggingãã¡ã€ã³ã®ãã®ã³ã°MXBeanãéžæããLoggerNames屿§ã®å€ãã£ãŒã«ããããã«ã¯ãªãã¯ããŸãã ãã®ã³ã°MXBeanã§ã¯ã次ã®2çš®é¡ã®åŠçããµããŒãããŠããŸãã
-
getLoggerLevel: æ¢å®ã®ãã¬ãŒã®ãã°ã»ã¬ãã«ãè¿ããŸãã
-
setLoggerLevel: æ¢å®ãã¬ãŒã®ãã°ã»ã¬ãã«ãæ°ããªã¬ãã«ã«èšå®ããŸãã
ãããã®åŠçã§ã¯ããã¬ãŒåã第1ãã©ã¡ãŒã¿ãšããŠååŸããŸãã ãã¬ãŒã®ãã°ã»ã¬ãã«ã倿Žããã«ã¯ããã¬ãŒåã第1ãã©ã¡ãŒã¿ã«å ¥åãããã®ã¬ãã«ã®ååãsetLoggerLevelåŠçã®ç¬¬2ãã©ã¡ãŒã¿ã«èšå®ããŸãã
ããŒã»ã¡ã¢ãªãŒã®æ€åº
ã¡ã¢ãªãŒã®äœ¿çšã¯ãã¡ã¢ãªãŒã»ã·ã¹ãã ã®éèŠãªèŠçŽ ãšãªããŸãã ããã¯ã次ã®åé¡ã®å¯èœæ§ã瀺åããŠããŸãã
-
ã¢ããªã±ãŒã·ã§ã³ã®é床ã®ã¡ã¢ãªãŒæ¶è²»ã
-
èªåã¡ã¢ãªãŒç®¡çã·ã¹ãã ãžã®é床ã®è² è·ã
-
æœåšçãªã¡ã¢ãªãŒã»ãªãŒã¯ã
ããŒã»ã¡ã¢ãªãŒç¶æ ã®æ€åºã«äœ¿çšå¯èœãªã¡ã¢ãªãŒã®ãããå€ã«ã¯ã䜿çšéãããå€ãšã³ã¬ã¯ã·ã§ã³äœ¿çšéãããå€ã®2çš®é¡ãçšæãããŠããŸãã ããŒãªã³ã°ãŸãã¯ãããå€éç¥ã§ãããã®ãããå€ã®ããããã䜿çšããŠãããŒã»ã¡ã¢ãªãŒç¶æ ãæ€åºã§ããŸãã ãããã®æŠå¿µã«ã€ããŠã¯ãã¹ãŠæ¬¡ã®ã»ã¯ã·ã§ã³ã§èª¬æããŸãã
ã¡ã¢ãªãŒãããå€
ã¡ã¢ãªãŒã»ããŒã«ã«ã¯ã䜿çšéãããå€ããã³ã³ã¬ã¯ã·ã§ã³äœ¿çšéãããå€ã®2çš®é¡ã®ã¡ã¢ãªãŒãããå€ãèšå®ããããšãã§ããŸãã ãããã®ãããå€ã®ã©ã¡ããäžæ¹ã¯ãç¹å®ã®ã¡ã¢ãªãŒã»ããŒã«ã§ãµããŒããããªãå¯èœæ§ããããŸãã 䜿çšéãããå€ãšã³ã¬ã¯ã·ã§ã³äœ¿çšéãããå€ã®å€ã¯ãJConsoleã®ãMBeanãã¿ãã§èšå®ã§ããŸãã
䜿çšéãããå€
䜿çšéãããå€ãšã¯ã管çå¯èœãªãäžéšã®ã¡ã¢ãªãŒã»ããŒã«ã®å±æ§ãæå³ããŸãã ãªãŒããŒããããäœãæããç¶æ ã§ã¡ã¢ãªãŒã®äœ¿çšç¶æ³ãã¢ãã¿ãŒããããšãã§ããŸãã ãããå€ãæ£ã®å€ã«èšå®ãããšãã¡ã¢ãªãŒã»ããŒã«ã¯äœ¿çšéãããå€ããã§ãã¯ããããšãã§ããŸãã 䜿çšéãããå€ã«0ãèšå®ãããšããã®äœ¿çšéãããå€ã®ãã§ãã¯æ©èœãç¡å¹ãšãªããŸãã ããã©ã«ãå€ã¯ãJava VMã§çšæãããŠããŸãã
Java VMã¯ãã¡ã¢ãªãŒã»ããŒã«ã«ãããŠã»ãŒé©åãªã¿ã€ãã³ã°ã§(äžè¬çã«ã¬ããŒãžã»ã³ã¬ã¯ã·ã§ã³ãçºçããŠããéã«)ããã®äœ¿çšéãããå€ã®ãã§ãã¯æ©èœãå®è¡ããŸãã åã¡ã¢ãªãŒã»ããŒã«ã¯ã䜿çšéããããå€ãè¶ ããå Žåã«åžžã«ãã®äœ¿çšéãããå€ã®æ°ãå¢å ããŸãã
äžéšã®ã¡ã¢ãªãŒã»ããŒã«ã«ã¯ã䜿çšéãããå€ãé©ããªãããšãããisUsageThresholdSupported()ã¡ãœããã䜿çšããŠã¡ã¢ãªãŒã»ããŒã«ã䜿çšéãããå€ããµããŒãããŠãããã©ããã確èªããŸãã ããšãã°ãäžä»£å¥ã¬ããŒãžã»ã³ã¬ã¯ã¿(HotSpot VMã®æ©èœã®1ã€ã第3ç« ãJConsoleã®äœ¿çšãã®ãã¬ããŒãžã»ã³ã¬ã¯ã·ã§ã³ããåç §)ã«ãããŠã¯ãEdenã¡ã¢ãªãŒã»ããŒã«ããã»ãšãã©ã®ãªããžã§ã¯ããè¥ãäžä»£ã®æ¹ã«å²ãåœãŠãããŸãã ãªããEdenããŒã«ã¯ãã®å®¹éããã£ã±ãã«ãªãããã«èšèšãããŠããŸãã Edenã¡ã¢ãªãŒã»ããŒã«ã®ã¬ããŒãžã»ã³ã¬ã¯ãã«ããããã®ã¡ã¢ãªãŒé åã®ã»ãšãã©ãè§£æŸãããŸããããã¯ãEdenã¡ã¢ãªãŒã»ããŒã«ã«å«ãŸãããªããžã§ã¯ãã®ã»ãšãã©ããã¬ããŒãžã»ã³ã¬ã¯ã·ã§ã³æã«ã¯ã¢ã¯ã»ã¹äžå¯èœãªçåœãªãªããžã§ã¯ãã§ãããšäºæ³ãããããã§ãã ãã®ãããEdenã¡ã¢ãªãŒã»ããŒã«ã¯ã䜿çšéãããå€ããµããŒãããã®ã«é©ããŠããŸããã
ã³ã¬ã¯ã·ã§ã³äœ¿çšéãããå€
ã³ã¬ã¯ã·ã§ã³äœ¿çšéãããå€ãšã¯ãã¬ããŒãžã»ã³ã¬ã¯ããããäžéšã®ã¡ã¢ãªãŒã»ããŒã«ã®å±æ§ãæå³ãããã®å±æ§ã¯ç®¡çã§ããããã«ãªã£ãŠããŸãã Java VMã§ã¡ã¢ãªãŒã»ããŒã«ã®ã¬ããŒãžã»ã³ã¬ã¯ããè¡ããšããã®ã¡ã¢ãªãŒã»ããŒã«äžã®äžéšã®ã¡ã¢ãªãŒã¯ãã以åŸãåŒãç¶ã䜿çšäžã®ç¶æ ã®ãŸãŸãšãªããŸãã ã³ã¬ã¯ã·ã§ã³äœ¿çšéãããå€ã«ããããã®ã¡ã¢ãªãŒã®å€ãèšå®ããããšãã§ããŸãã ããŒã«ã§ã³ã¬ã¯ã·ã§ã³äœ¿çšéãããå€ããµããŒããããŠãããã©ããã倿ããã«ã¯ãMemoryPoolMXBeanã®isCollectionUsageThresholdSupported()ã¡ãœããã䜿çšããŸãã
Java VMã¯ãã¬ããŒãžã»ã³ã¬ã¯ã·ã§ã³ãè¡ããšãã«ãã¡ã¢ãªãŒã»ããŒã«ã«ãããã³ã¬ã¯ã·ã§ã³äœ¿çšéãããå€ããã§ãã¯ããå ŽåããããŸãã ãªãããã®ãã§ãã¯æ©èœãæå¹ã«ããã«ã¯ããã®ãããå€ã«æ£ã®å€ãèšå®ããŸãã ãã§ãã¯æ©èœãç¡å¹ã«ããå Žåã¯ããã®å€ã«0 (ããã©ã«ãå€)ãèšå®ããŸãã
䜿çšéãããå€ããšã³ã¬ã¯ã·ã§ã³äœ¿çšéãããå€ã¯ããããããJConsoleãã®ãMBeanãã¿ãã§èšå®ããããšãã§ããŸãã
Memory MXBean
ãã©ãããã©ãŒã MemoryMXBeanã䜿çšããŠã¡ã¢ãªãŒã®ããŸããŸãªãããå€ã管çããããšãã§ããŸãã MemoryMXBeanã§ã¯ã次ã®4ã€ã®å±æ§ãå®çŸ©ããŸãã
-
HeapMemoryUsage: çŸåšã®ããŒãã»ã¡ã¢ãªãŒã®äœ¿çšç¶æ³ã瀺ãèªåãå°çšã®å±æ§ã§ãã
-
NonHeapMemoryUsage: éããŒãã»ã¡ã¢ãªãŒã®äœ¿çšç¶æ³ã瀺ãèªåãå°çšã®å±æ§ã§ãã
-
ObjectPendingFinalizationCount: ãã¡ã€ãã©ã€ãºãä¿çããŠãããªããžã§ã¯ãã®æ°ã瀺ãèªåãå°çšã®å±æ§ã§ãã
-
Verbose: ã¬ããŒãžã»ã³ã¬ã¯ã·ã§ã³(GC)ã®åé·ãã¬ãŒã¹èšå®ã瀺ãããŒã«åã®å±æ§ã§ãã ãã®å€ã¯åçã«èšå®ããããšãã§ããŸãã GCã®åé·ãã¬ãŒã¹ã¯ãJava VMãéå§ããéã«æå®ããäœçœ®ã«è¡šç€ºãããŸãã Hotspot VMã®GCåé·åºåã«ãããããã©ã«ãã®äœçœ®ã¯ãstdoutãšãªããŸãã
ã¡ã¢ãªãŒMXBeanã§ã¯ãæç€ºçã«ã¬ããŒãžã»ã³ã¬ã¯ã·ã§ã³ãèŠæ±ã§ãããããåŠçgcã1ã€ãµããŒãããŠããŸãã
ã¡ã¢ãªãŒMXBeanã®ã€ã³ã¿ãã§ãŒã¹ã«é¢ãã詳现ã¯ãjava.lang.management.MemoryMXBean仿§ã«å®çŸ©ãããŠããŸãã
Memory Pool MXBean
ãã©ãããã©ãŒã MXBeanã®MemoryPoolMXBeanã§ã¯ãã¡ã¢ãªãŒã®ãããå€ã管çããããã«äžé£ã®åŠçãå®çŸ©ããŸãã
-
getUsageThreshold()
-
setUsageThreshold(long threshold)
-
isUsageThresholdExceeded()
-
isUsageThresholdSupported()
-
getCollectionUsageThreshold()
-
setCollectionUsageThreshold(long threshold)
-
isCollectionUsageThresholdSupported()
-
isCollectionUsageThresholdExceeded()
åã¡ã¢ãªãŒã»ããŒã«ã«ã¯ãããŒã»ã¡ã¢ãªãŒã®æ€åºããµããŒãããäžã§ã䜿çšéãããå€ããã³ã³ã¬ã¯ã·ã§ã³äœ¿çšéãããå€ã®2çš®é¡ã®ã¡ã¢ãªãŒãããå€ãçšæãããŠããŸãã ãããã®ãããå€ã®ã©ã¡ããäžæ¹ã¯ãç¹å®ã®ã¡ã¢ãªãŒã»ããŒã«ã§ãµããŒããããªãå¯èœæ§ããããŸãã 詳ããã¯ãMemoryPoolMXBeanã¯ã©ã¹ã®APIãªãã¡ã¬ã³ã¹ã»ããã¥ã¡ã³ããåç §ããŠãã ããã
ããŒãªã³ã°
ã¢ããªã±ãŒã·ã§ã³ã§ã¯ããã¹ãŠã®ã¡ã¢ãªãŒã»ããŒã«çšã®getUsage()ã¡ãœããããŸãã¯äœ¿çšéãããå€ããµããŒãããã¡ã¢ãªãŒã»ããŒã«çšã®isUsageThresholdExceeded()ã¡ãœãããåŒã³åºãããšã«ãããã¢ããªã±ãŒã·ã§ã³èªäœã®ã¡ã¢ãªãŒäœ¿çšéãç¶ç¶çã«ã¢ãã¿ãŒã§ããŸãã
äŸ 4-6ã§ã¯ãã¿ã¹ã¯ã®é 眮ãšåŠçã®ããã«èšããããå°çšã®ã¹ã¬ããã䜿çšãããŠããŸãã åééã§ã¯ãã¡ã¢ãªãŒã®äœ¿çšéã«åºã¥ãæ°ããã¿ã¹ã¯ã®åãåããåŠçãè¡ããã©ããã倿ããŸãã ã¡ã¢ãªãŒã®äœ¿çšéããã®äœ¿çšéãããå€ãäžåãå Žåããã®ã¡ã¢ãªãŒã®äœ¿çšéããããå€ãäžåããŸã§å¥ã®VMã«æªåŠçã®ã¿ã¹ã¯ãåé 眮ããæ°ããã¿ã¹ã¯ãåãåããªãããã«ããŸãã
äŸ 4-6ããŒãªã³ã°ã®äœ¿çš
pool.setUsageThreshold(myThreshold);
....
boolean lowMemory = false;
while (true) {
if (pool.isUsageThresholdExceeded()) {
lowMemory = true;
redistributeTasks(); // redistribute tasks to other VMs
stopReceivingTasks(); // stop receiving new tasks
} else {
if (lowMemory) { // resume receiving tasks
lowMemory = false;
resumeReceivingTasks();
}
// processing outstanding task
...
}
// sleep for sometime
try {
Thread.sleep(sometime);
} catch (InterruptedException e) {
...
}
}
äŸ 4-6ã§ã¯ãã¡ã¢ãªãŒã®äœ¿çšéããã®äœ¿çšéãããå€ãäžæçã«äžåãå Žåãšã2ã€ã®ç¹°è¿ãéã«ãããŠã¡ã¢ãªãŒã®äœ¿çšéããããå€ãäžåã£ããŸãŸã®ç¶æ ã§ããå Žåã®åºå¥ããããŸããã getUsageThresholdCount()ããè¿ããã䜿çšéãããå€ã®æ°ã䜿çšããŠãã¡ã¢ãªãŒã®äœ¿çšéãã2ã€ã®ããŒãªã³ã°éã§ãããå€ãäžåãå€ãè¿ããã©ããã倿ããŸãã
代ããã«ã³ã¬ã¯ã·ã§ã³äœ¿çšéãããå€ããã¹ãããã«ã¯ãåè¿°ãšåãæ¹æ³ã§isCollectionUsageThresholdSupported()ãisCollectionThresholdExceeded()ãããã³getCollectionUsageThreshold()ã¡ãœããã䜿çšããŸãã
ãããå€éç¥
MemoryMXBeanã§ã¡ã¢ãªãŒã»ããŒã«ã®äœ¿çšéããã®ãããå€ã«å°éããŠããããäžåã£ãŠããããšãæ€åºããããšãã¯ã䜿çšéãããå€è¶ ééç¥ãçºè¡ãããŸãã 䜿çšéããããå€ãäžåãããµããã³äžåããŸã§ãMemoryMXBeanã¯ãå¥ã®äœ¿çšéãããå€è¶ ééç¥ãçºè¡ããŸããã åæ§ã«ãã¬ããŒãžã»ã³ã¬ã¯ã·ã§ã³åŸã®ã¡ã¢ãªãŒã®äœ¿çšéããã³ã¬ã¯ã·ã§ã³äœ¿çšéãããå€ãäžåãå ŽåãMemoryMXBeanã§ã¯ãã³ã¬ã¯ã·ã§ã³äœ¿çšéãããå€è¶ ééç¥ãçºè¡ããŸãã
äŸ 4-7ã¯ãäŸ 4-6ãšåãããžãã¯ãå®è£ ããŠããŸãããããŒã»ã¡ã¢ãªãŒç¶æ ãæ€åºããããã«äœ¿çšéãããå€éç¥ã䜿çšããŸãã éç¥ãåãåããšããªã¹ããŒã¯ãæªåŠçã¿ã¹ã¯ã®åé çœ®ãæ°ã¿ã¹ã¯ã®åãå ¥ãæåŠãæ°ã¿ã¹ã¯ã®ååãå ¥ããªã©ã®ã¢ã¯ã·ã§ã³ãå®è¡ããããã«å¥ã®ã¹ã¬ããã®éç¥ãè¡ããŸãã
äžè¬ã«ã以åŸã®éç¥ã®é ããåé¿ããããã«ãåŠçéãæå°éã«ããhandleNotificationã¡ãœãããèšèšããå¿ èŠããããŸãã æéãæµªè²»ããã¢ã¯ã·ã§ã³ã¯å¥ã®ã¹ã¬ããã«ãããŠå®è¡ããããã«ããŠãã ããã è€æ°ã®ã¹ã¬ããã§éç¥ãªã¹ããŒãåæã«åŒã³åºãããšãã§ããããããªã¹ããŒã¯ãã¿ã¹ã¯ãæ£åžžã«å®è¡ãããããã«ãã®ã¿ã¹ã¯ãåæãããå¿ èŠããããŸãã
äŸ 4-7ãããå€éç¥ã®äœ¿çš
class MyListener implements javax.management.NotificationListener {
public void handleNotification(Notification notification, Object handback) {
String notifType = notification.getType();
if (notifType.equals(MemoryNotificationInfo.MEMORY_THRESHOLD_EXCEEDED)) {
// potential low memory, redistribute tasks to other VMs & stop receiving new tasks.
lowMemory = true;
notifyAnotherThread(lowMemory);
}
}
}
// Register MyListener with MemoryMXBean
MemoryMXBean mbean = ManagementFactory.getMemoryMXBean();
NotificationEmitter emitter = (NotificationEmitter) mbean;
MyListener listener = new MyListener();
emitter.addNotificationListener(listener, null, null);
ãã®ã¡ã¢ãªãŒã»ããŒã«ã§äœ¿çšéãããå€ããµããŒããããã®ãšä»®å®ããå Žåããããå€(å€ãäžåããšã¢ããªã±ãŒã·ã§ã³ã§æ°ã¿ã¹ã¯ãåãå ¥ããªããªããããå€)ãããå€(ãã€ãæ°è¡šèš)ã«èšå®ããããšãã§ããŸãã
pool.setUsageThreshold(myThreshold);
ãã®ããšã䜿çšéãããå€ã®æ€åºãæå¹ãšãªããMyListenerã§éç¥ãåŠçãããŸãã

å