java.lang.management パッケージ - RuntimeMXBean インタフェース
ManagementFactory クラスを介して取得できるMXBeanの一つが実装するインタフェース。
- java.lang.management パッケージ - ManagementFactory クラス - HHeLiBeXの日記 正道編
- RuntimeMXBean (Java 2 Platform SE 5.0)
これは実行環境(runtime)に関する情報を取得するためのMXBean。たとえばクラスパスとか、Java VMのバージョンとか。
実際に実行してみる。
今回用いたのは、次のJava VM。
import java.lang.management.ManagementFactory; import java.lang.management.RuntimeMXBean; import java.util.List; public class Main { /** * @param args */ public static void main(String[] args) { System.out.printf("%-23s = %s\n", "java.version", System.getProperty("java.version")); System.out.printf("%-23s = %s\n", "java.vendor", System.getProperty("java.vendor")); System.out.printf("%-23s = %s\n", "java.runtime.version", System.getProperty("java.runtime.version")); System.out.printf("%-23s = %s\n", "os.name", System.getProperty("os.name")); System.out.println("========"); RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean(); System.out.printf("%-3s %-24s: %s\n", "[C]", "BootClassPath", checkEquals(runtimeMXBean.getBootClassPath(), System.getProperty("sun.boot.class.path"), "System.getProperty(\"sun.boot.class.path\")")); System.out.printf("%-3s %-24s: %s\n", "[C]", "ClassPath", checkEquals(runtimeMXBean.getClassPath(), System.getProperty("java.class.path"), "System.getProperty(\"java.class.path\")")); System.out.printf("%-3s %-24s:\n", "", "InputArguments"); { List<String> inputArguments = runtimeMXBean.getInputArguments(); int i = 0; for (String arg : inputArguments) { System.out.printf(" [%2d]: %s\n", i, arg); ++i; } } System.out.printf("%-3s %-24s: %s\n", "[C]", "LibraryPath", checkEquals(runtimeMXBean.getLibraryPath(), System.getProperty("java.library.path"), "System.getProperty(\"java.library.path\")")); System.out.printf("%-3s %-24s: %s\n", "", "ManagementSpecVersion", runtimeMXBean.getManagementSpecVersion()); System.out.printf("%-3s %-24s: %s\n", "", "Name", runtimeMXBean.getName()); System.out.printf("%-3s %-24s: %s\n", "", "SpecName", runtimeMXBean.getSpecName()); System.out.printf("%-3s %-24s: %s\n", "", "SpecVendor", runtimeMXBean.getSpecVendor()); System.out.printf("%-3s %-24s: %s\n", "", "SpecVersion", runtimeMXBean.getSpecVersion()); System.out.printf("%-3s %-24s: %20d\n", "", "StartTime", runtimeMXBean.getStartTime()); System.out.printf("%-3s %-24s: %s\n", "[C]", "SystemProperties", checkEquals(runtimeMXBean.getSystemProperties(), System.getProperties(), "System.getProperties()")); System.out.printf("%-3s %-24s: %20d\n", "", "Uptime", runtimeMXBean.getUptime()); System.out.printf("%-3s %-24s: %s\n", "", "VmName", runtimeMXBean.getVmName()); System.out.printf("%-3s %-24s: %s\n", "", "VmVendor", runtimeMXBean.getVmVendor()); System.out.printf("%-3s %-24s: %s\n", "", "VmVersion", runtimeMXBean.getVmVersion()); System.out.printf("%-3s %-24s: %s\n", "", "isBootClassPathSupported", runtimeMXBean.isBootClassPathSupported()); } private static String checkEquals(Object o1, Object o2, String targetName) { return "**" + (o1.equals(o2) ? "EQUAL" : "NOT EQUAL") + " to " + targetName + "**"; } }
今回は実行環境に関する情報ということで、システムプロパティなどから取得可能な情報も出力してみた、と言いたいところだが、クラスパスなど値が長すぎるものも多いので、そういったものに関しては対応するシステムプロパティの値と等しいかどうかを出力する方法を採用した。行頭に"[C]"とあるのはシステムプロパティなどの値と比較した結果。
また、実行に際しては、次のような感じでコマンドを実行している。(環境情報を隠すため、環境変数PATHは必要最低限にしている。)
REM xxxxx = REM (Sun) D:\lang\java\jdk1.5.0_22 REM (IBM) E:\Program Files\IBM\Java50 SET JAVA_HOME=xxxxx SET PATH=%JAVA_HOME%\bin MKDIR C:\work CD /D C:\work MKDIR classes javac -d classes Main.java java -classpath %CD%\classes -Dhoge.foo="bar, ugo,ukeke" Main hoge foo bar
java.version = 1.5.0_22 java.vendor = Sun Microsystems Inc. java.runtime.version = 1.5.0_22-b03 os.name = Windows Vista ======== [C] BootClassPath : **EQUAL to System.getProperty("sun.boot.class.path")** [C] ClassPath : **EQUAL to System.getProperty("java.class.path")** InputArguments : [ 0]: -Dhoge.foo=bar, [ 1]: ugo,ukeke [C] LibraryPath : **EQUAL to System.getProperty("java.library.path")** ManagementSpecVersion : 1.0 Name : 7968@proteus SpecName : Java Virtual Machine Specification SpecVendor : Sun Microsystems Inc. SpecVersion : 1.0 StartTime : 1258344707712 [C] SystemProperties : **EQUAL to System.getProperties()** Uptime : 134 VmName : Java HotSpot(TM) Client VM VmVendor : Sun Microsystems Inc. VmVersion : 1.5.0_22-b03 isBootClassPathSupported: true
java.version = 1.5.0 java.vendor = IBM Corporation java.runtime.version = pwi32dev-20090707 (SR10 ) os.name = Windows Vista ======== [C] BootClassPath : **EQUAL to System.getProperty("sun.boot.class.path")** [C] ClassPath : **EQUAL to System.getProperty("java.class.path")** InputArguments : [ 0]: -Xjcl:jclscar_23 [ 1]: -Dcom.ibm.oti.vm.bootstrap.library.path=E:\Program Files\IBM\Java50\jre\bin [ 2]: -Dsun.boot.library.path=E:\Program Files\IBM\Java50\jre\bin [ 3]: -Djava.library.path=E:\Program Files\IBM\Java50\jre\bin;.;"E:\Program Files\IBM\Java50"\bin [ 4]: -Djava.home=E:\Program Files\IBM\Java50\jre [ 5]: -Djava.ext.dirs=E:\Program Files\IBM\Java50\jre\lib\ext [ 6]: -Duser.dir=C:\work [ 7]: _j2se_j9=70912 [ 8]: -Xdump [ 9]: -Dconsole.encoding=MS932 [10]: vfprintf [11]: -Dhoge.foo=bar, ugo,ukeke [12]: -Dinvokedviajava [13]: -Djava.class.path=C:\work\classes [14]: vfprintf [15]: _port_library [C] LibraryPath : **EQUAL to System.getProperty("java.library.path")** ManagementSpecVersion : 1.0 Name : 5328@proteus SpecName : Java Virtual Machine Specification SpecVendor : Sun Microsystems Inc. SpecVersion : 1.0 StartTime : 1258344708482 [C] SystemProperties : **EQUAL to System.getProperties()** Uptime : 445 VmName : IBM J9 VM VmVendor : IBM Corporation VmVersion : 2.3 isBootClassPathSupported: true
- BootClassPath
- InputArguments
- Name
- '@'の後の"proteus"というのは実行したマシンのマシン名。'@'の前の数字はプロセスIDのようだ。