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

【Java】RuntimeクラスでJVMのメモリ情報と使用可能なプロセッサ(コア)を取得する

スポンサーリンク

Runtimeクラスを使用してJava仮想マシンのメモリ情報と、使用可能なプロセッサ(コア)数を取得する方法です。使うことはほとんど無いかもしれません。

使用可能なプロセッサ(コア)数の取得方法

Java仮想マシンが使用できるプロセッサ(コア)の数を得るにはRuntime#availableProcessorsを使用します。

用途としては JavaDoc に「利用可能なプロセッサ数に影響を受けるアプリケーションは、このプロパティをときどきポーリングして、リソース使用法を調整する必要があります」と書かれているとおり、マルチスレッドの処理でスレッド数を調整するのに使ってるのを見たことがあるくらいですね。

public class RuntimeCoreTest {
    public static void main(String[] args) {
        System.out.println("CPU: " + Runtime.getRuntime().availableProcessors());
    }
}

実行結果は以下の通りです。

$ java RuntimeCoreTest
CPU: 16

メモリ使用量の取得方法

Java仮想マシンのメモリ情報は以下の通り取得することが可能です。

  • Runtime#totalMemoryJava仮想マシンのメモリーの総容量
  • Runtime#freeMemoryJava仮想マシン内の空きメモリーの容量
  • Runtime#maxMemoryJava仮想マシンが使用を試みる最大メモリ容量
public class RuntimeMemoryTest {
    public static void main(String[] args) {
        long total = Runtime.getRuntime().totalMemory();
        long free = Runtime.getRuntime().freeMemory();
        long used = total - free;
        long max = Runtime.getRuntime().maxMemory();
        System.out.println("total => " + total / 1024 + "KB");
        System.out.println("free  => " + free / 1024 + "KB");
        System.out.println("used  => " + (total - free) / 1024 + "KB");
        System.out.println("max   => " + max / 1024 + "KB");
    }
}

実行結果は以下の通りとなります。usedは総容量から空き容量を引いて使用している容量を出しているだけです。

$ java RuntimeMemoryTest
total => 741888KB
free  => 734146KB
used  => 7741KB
max   => 10982912KB

totalMemorymaxMemoryの違いが分かりずらいと思いますが、totalMemoryは現在、Java仮想マシンに割り当てられているメモリの総容量であり、-Xmsで割り当てるヒープサイズと一致し、maxMemoryはJava仮想マシンが使用を試みる(割り当てを行う)最大のメモリ容量であり、-Xmxで割り当てるヒープサイズと一致します。freeMemoryは現在、割り当てられているメモリtotalMemoryにおける空き容量となります。

$ java -Xms10m -Xmx512m RuntimeMemoryTest
total => 9728KB
free  => 9253KB
used  => 474KB
max   => 466432KB

 Runtime (Java Platform SE 8)