広告

Java : Runtime - API使用例

Runtime (Java SE 19 & JDK 19) の使用例まとめです。
だいたいのメソッドを網羅済みです。
API仕様のおともにどうぞ。


概要

JavaアプリケーションはすべてRuntimeクラスの単一のインスタンスを持ちます。このクラスは、アプリケーションとアプリケーション実行環境とのインタフェースになります。 現在のRuntimeオブジェクトは、getRuntimeメソッドにより取得できます。

クラス構成

Runtime クラスを使うと、

  • Java仮想マシンのメモリ容量を取得
  • 外部プロセスの起動

といったことが可能となります。
ただし、外部プロセスの起動については、代わりに ProcessBuilder を使うことが推奨されています。

public class Main {
    public static void main(String[] args) {
        final var runtime = Runtime.getRuntime();

        final var large = new byte[200000000];
        System.out.println("use   = " + large.length / (1024 * 1024) + "MB");

        System.out.println("max   = " + runtime.maxMemory() / (1024 * 1024) + "MB");
        System.out.println("total = " + runtime.totalMemory() / (1024 * 1024) + "MB");
        System.out.println("free  = " + runtime.freeMemory() / (1024 * 1024) + "MB");
    }
}

// 結果
// ↓
//use   = 190MB
//max   = 8184MB
//total = 512MB
//free  = 316MB

Windows でメモ帳を起動する例です。

final String[] command = {"notepad"};

final var runtime = Runtime.getRuntime();
final var process = runtime.exec(command);
System.out.println(process); // Process[pid=14796, exitValue="not exited"]

final var ret = process.waitFor();
System.out.println(ret); // 0

 ↓

メモ帳


メソッド

void addShutdownHook (Thread hook)

新しい仮想マシンのシャットダウン・フックを登録します。

public class Main {
    public static void main(String[] args) {
        System.out.println("main : start");

        final var hook = new Thread(() -> {
            System.out.println("Hook!");
        });

        final var runtime = Runtime.getRuntime();
        runtime.addShutdownHook(hook);

        if (args.length == 1 && "remove".equals(args[0])) {
            System.out.println("remove hook!");
            runtime.removeShutdownHook(hook);
        }

        System.out.println("main : end");
    }
}

// 結果
// ↓
//> java Main
//main : start
//main : end
//Hook!
//
//> java Main remove
//main : start
//remove hook!
//main : end

int availableProcessors ()

Java仮想マシンが使用できるプロセッサの数を返します。

final var runtime = Runtime.getRuntime();
System.out.println(runtime.availableProcessors()); // 8

Process exec (String command)

非推奨。 このメソッドはエラーが発生しやすく、使用しないでください。対応するメソッドexec(String[])またはProcessBuilderを代わりに使用する必要があります。

非推奨です。

Process exec (String[] cmdarray)

指定されたコマンドと引数を、独立したプロセスで実行します。

public class Exec {
    public static void main(String[] args) {
        System.out.println("TEST 1");
        System.out.println("TEST 2");
        System.out.println("TEST 3");
    }
}
public class Main {
    public static void main(String[] args) throws IOException, InterruptedException {
        System.out.println("main : start");

        final String[] cmdarray = {"java", "Exec"};
        final var runtime = Runtime.getRuntime();

        final var process = runtime.exec(cmdarray);
        try (final var reader = process.inputReader()) {
            reader.lines().forEach(System.out::println);
        }
        System.out.println("waitFor : " + process.waitFor());

        System.out.println("main : end");
    }
}

// 結果
// ↓
//> java Main
//main : start
//TEST 1
//TEST 2
//TEST 3
//waitFor : 0
//main : end

Process exec (String[] cmdarray, String[] envp)

指定されたコマンドと引数を、指定された環境を持つ独立したプロセスで実行します。

public class Exec {
    public static void main(String[] args) {
        System.out.println("env1=" + System.getenv("env1"));
        System.out.println("env2=" + System.getenv("env2"));
        System.out.println("env3=" + System.getenv("env3"));
    }
}
public class Main {
    public static void main(String[] args) throws IOException, InterruptedException {
        System.out.println("main : start");

        final String[] cmdarray = {"java", "Exec"};
        final String[] envp = {"env1=aaa", "env2=bbb", "env3=ccc"};

        final var runtime = Runtime.getRuntime();

        final var process = runtime.exec(cmdarray, envp);
        try (final var reader = process.inputReader()) {
            reader.lines().forEach(System.out::println);
        }
        System.out.println("waitFor : " + process.waitFor());

        System.out.println("main : end");
    }
}

// 結果
// ↓
//> java Main
//main : start
//env1=aaa
//env2=bbb
//env3=ccc
//waitFor : 0
//main : end

Process exec (String[] cmdarray, String[] envp, File dir)

指定されたコマンドと引数を、指定された環境と作業ディレクトリを持つ独立したプロセスで実行します。

public class Exec {
    public static void main(String[] args) {
        System.out.println("user.dir=" + System.getProperty("user.dir"));
    }
}
public class Main {
    public static void main(String[] args) throws IOException, InterruptedException {
        System.out.println("main : start");

        final String[] cmdarray = {"java", "Exec"};
        final String[] envp = {"env1=aaa", "env2=bbb", "env3=ccc"};
        final var dir = Path.of("R:", "java-work", "dir");

        final var runtime = Runtime.getRuntime();

        final var process = runtime.exec(cmdarray, envp, dir.toFile());
        try (final var reader = process.inputReader()) {
            reader.lines().forEach(System.out::println);
        }
        System.out.println("waitFor : " + process.waitFor());

        System.out.println("main : end");
    }
}

// --- PowerShell ---
//PS R:\java-work> tree /F
//...
//R:.
//│  Main.class
//│  Main.java
//│
//└─dir
//        Exec.class
//        Exec.java
//
//PS R:\java-work> java Main
//main : start
//user.dir=R:\java-work\dir
//waitFor : 0
//main : end

Process exec (String command, String[] envp)

非推奨。 このメソッドはエラーが発生しやすく、使用しないでください。対応するメソッドexec(String[], String[])またはProcessBuilderを代わりに使用する必要があります。

非推奨です。

Process exec (String command, String[] envp, File dir)

非推奨。 このメソッドはエラーが発生しやすく、使用しないでください。対応するメソッドexec(String[], String[], File)またはProcessBuilderを代わりに使用する必要があります。

非推奨です。

void exit (int status)

現在実行しているJava仮想マシンを、シャットダウン・シーケンスを開始して終了します。

public class Main {
    public static void main(String[] args) {
        System.out.println("main : start");

        final var hook = new Thread(() -> {
            System.out.println("Hook!");
        });

        final var runtime = Runtime.getRuntime();
        runtime.addShutdownHook(hook);

        if (args.length == 1) {
            switch (args[0]) {
                case "exit" -> {
                    System.out.println("exit");
                    runtime.exit(0);
                }
                case "halt" -> {
                    System.out.println("halt");
                    runtime.halt(0);
                }
            }
        }

        System.out.println("main : end");
    }
}

// 結果
// ↓
//> java Main
//main : start
//main : end
//Hook!
//
//> java Main exit
//main : start
//exit
//Hook!
//
//> java Main halt
//main : start
//halt

long freeMemory ()

Java仮想マシン内の空きメモリーの量を返します。

public class Main {
    public static void main(String[] args) {
        final var runtime = Runtime.getRuntime();

        final var large = new byte[200000000];
        System.out.println("use   = " + large.length / (1024 * 1024) + "MB");

        System.out.println("max   = " + runtime.maxMemory() / (1024 * 1024) + "MB");
        System.out.println("total = " + runtime.totalMemory() / (1024 * 1024) + "MB");
        System.out.println("free  = " + runtime.freeMemory() / (1024 * 1024) + "MB");
    }
}

// 結果
// ↓
//use   = 190MB
//max   = 8184MB
//total = 512MB
//free  = 316MB

void gc ()

Java Virtual Machineでガベージ・コレクタを実行します。

関連:System.gc

final var runtime = Runtime.getRuntime();

var sb = new StringBuilder("abcd");
final var ref = new WeakReference<>(sb);

System.out.println(ref.get()); // abcd

sb = null;
runtime.gc();

System.out.println(ref.get()); // null

static Runtime getRuntime ()

現在のJavaアプリケーションに関連したRuntimeオブジェクトを返します。

このメソッドの使用例は、freeMemory() にまとめて記載しました。
そちらのAPI使用例をご参照ください。

void halt (int status)

現在実行中のJava仮想マシンを強制終了します。

このメソッドの使用例は、exit(int status) にまとめて記載しました。
そちらのAPI使用例をご参照ください。

void load (String filename)

filename引数によって指定されたネイティブ・ライブラリをロードします。

関連:System.load

※Windows 10 で実行した例となります。

public class JniSample {

    public native int sum(int a, int b);
}

JNI用のコード(cpp)

JNIEXPORT jint JNICALL Java_JniSample_sum
(JNIEnv*, jobject, jint a, jint b) {

    return a + b;
}

DLLを作成して R:\java-work\lib\JniSample.dll に配置します。

public class JniMain {

    public static void main(String[] args) {

        final var libPath = Path.of("R:", "java-work", "lib", "JniSample.dll");
        System.out.println(libPath); // R:\java-work\lib\JniSample.dll

        final var runtime = Runtime.getRuntime();
        runtime.load(libPath.toString());

        final var sample = new JniSample();

        final var ret = sample.sum(100, 200);
        System.out.println(ret); // 300
    }
}

void loadLibrary (String libname)

引数libnameによって指定されるネイティブ・ライブラリをロードします。

関連:System.loadLibrary

※Windows 10 で実行した例となります。

public class JniSample {

    public native int sum(int a, int b);
}

JNI用のコード(cpp)

JNIEXPORT jint JNICALL Java_JniSample_sum
(JNIEnv*, jobject, jint a, jint b) {

    return a + b;
}

DLLを作成して R:\java-work\lib\JniSample.dll に配置します。

public class JniMain {

    public static void main(String[] args) {

        final var runtime = Runtime.getRuntime();
        runtime.loadLibrary("JniSample");

        final var sample = new JniSample();

        final var ret = sample.sum(100, 200);
        System.out.println(ret); // 300
    }
}

javaコマンドのオプション(-D)で、java.library.pathプロパティにdllを配置したディレクトリを指定します。

java -D"java.library.path=R:\java-work\lib" JniMain

long maxMemory ()

Java仮想マシンが使用を試みる最大メモリー容量を返します。

このメソッドの使用例は、freeMemory() にまとめて記載しました。
そちらのAPI使用例をご参照ください。

boolean removeShutdownHook (Thread hook)

すでに登録した仮想マシンのシャットダウン・フックを登録解除します。

このメソッドの使用例は、addShutdownHook(Thread hook) にまとめて記載しました。
そちらのAPI使用例をご参照ください。

void runFinalization ()

削除予定のため非推奨: このAPI要素は、将来のバージョンで削除される可能性があります。 最終決定は削除のために非推奨になりました。

非推奨です。

long totalMemory ()

Java仮想マシンのメモリーの総容量を返します。

このメソッドの使用例は、freeMemory() にまとめて記載しました。
そちらのAPI使用例をご参照ください。

static Runtime.Version version ()

Java Runtime EnvironmentのバージョンをRuntime.Versionとして返します。

final var version = Runtime.version();
System.out.println(version); // 19.0.2+7-44

関連記事

ページの先頭へ