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