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のようだ。