読者です 読者をやめる 読者になる 読者になる

HHeLiBeXの日記 正道編

日々の記憶の記録とメモ‥

java.lang.management パッケージ - RuntimeMXBean インタフェース

Java Java 1.4 to 5.0

ManagementFactory クラスを介して取得できるMXBeanの一つが実装するインタフェース。

これは実行環境(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

Sun Java 2 SDK 1.5.0_22

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

IBM Java 2 SDK 1.5.0 SR10

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
    • あくまでもJava VMに対する引数であり、mainクラス名(今回は"Main")とその引数は対象ではないらしい。
    • 一つの引数として指定したはずの「-Dhoge.foo="bar, ugo,ukeke"」が、SunのJava VMだと2つの引数として扱われている。(システムプロパティ"hoge.foo"の値としては、どのJava VMも"bar, ugo,ukeke"がセットされているようだが‥)
  • Name
    • '@'の後の"proteus"というのは実行したマシンのマシン名。'@'の前の数字はプロセスIDのようだ。