1. 概要

このクイックチュートリアルでは、Javaで主要な指標を監視する方法について説明します。 コアJavaAPIのみを使用して、ディスク容量、メモリ使用量、およびスレッドデータに焦点を当てます。

最初の例では、Fileクラスを使用して特定のディスク情報を照会します。

次に、 ManagementFactory クラスに飛び込んで、メモリ使用量とプロセッサ情報を分析します。

最後に、 Javaプロファイラーを使用して、実行時にこれらの主要なメトリックを監視する方法について説明します。

2. ファイルクラスの概要

簡単に言えば、Fileクラスはファイルまたはディレクトリの抽象化を表します。 ファイルシステムに関する重要な情報を取得し、OSの独立性をファイルパスに関して維持するために使用できます。 このチュートリアルでは、このクラスを使用して、WindowsマシンとLinuxマシンの両方でルートパーティションを調べます。

3. ManagementFactory

Javaは、JVMに関する固有の情報を含む管理対象Bean(MXBeans)を取得するためのファクトリとしてManagementFactoryクラスを提供します。 次のコード例で2つを調べます。

3.1. MemoryMXBean

MemoryMXBeanは、JVMのメモリシステムの管理インターフェイスを表します。 実行時に、JVMはこのインターフェースの単一インスタンスを作成します。これは ManagementFactorygetMemoryMXBean()メソッドを使用して取得できます。

3.2. ThreadMXBean

MemoryMXBean と同様に、ThreadMXBeanはJVMのスレッドシステムの管理インターフェイスです。 getThreadMXBean()メソッドを使用して呼び出すことができ、スレッドに関する重要なデータを保持します。

次の例では、 ThreadMXBean を使用して、JVMで実行されているスレッドに関する特定の情報を含むJVMのThreadInfoクラスを取得します。

3. ディスク使用量の監視

このコード例では、Fileクラスを使用して、パーティションに関する重要な情報を含めます。 次の例では、WindowsマシンのC:ドライブから空き容量、合計容量、および使用可能容量を返します。

File cDrive = new File("C:");
System.out.println(String.format("Total space: %.2f GB",
  (double)cDrive.getTotalSpace() /1073741824));
System.out.println(String.format("Free space: %.2f GB", 
  (double)cDrive.getFreeSpace() /1073741824));
System.out.println(String.format("Usable space: %.2f GB", 
  (double)cDrive.getUsableSpace() /1073741824));

同様に、Linuxマシンルートディレクトリについても同じ情報を返すことができます。

File root = new File("/");
System.out.println(String.format("Total space: %.2f GB", 
  (double)root.getTotalSpace() /1073741824));
System.out.println(String.format("Free space: %.2f GB", 
  (double)root.getFreeSpace() /1073741824));
System.out.println(String.format("Usable space: %.2f GB", 
  (double)root.getUsableSpace() /1073741824));

上記のコードは、定義されたファイルの合計の空き領域と使用可能な領域を出力します。 デフォルトでは、上記のメソッドはバイト数を提供します。 これらのバイトをギガバイトに変換して、結果をより人間が読めるようにしました。

4. メモリ使用量の監視

次に、 ManagementFactoryクラスを使用して、MemoryMXBean を呼び出して、JVMで使用可能なメモリをクエリします。

この例では、主にヒープメモリのクエリに焦点を当てます。 非ヒープメモリは、 MemoryMXBean:を使用してクエリすることもできることに注意してください。

MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean();
System.out.println(String.format("Initial memory: %.2f GB", 
  (double)memoryMXBean.getHeapMemoryUsage().getInit() /1073741824));
System.out.println(String.format("Used heap memory: %.2f GB", 
  (double)memoryMXBean.getHeapMemoryUsage().getUsed() /1073741824));
System.out.println(String.format("Max heap memory: %.2f GB", 
  (double)memoryMXBean.getHeapMemoryUsage().getMax() /1073741824));
System.out.println(String.format("Committed memory: %.2f GB", 
  (double)memoryMXBean.getHeapMemoryUsage().getCommitted() /1073741824));

上記の例では、初期メモリ、使用済みメモリ、最大メモリ、およびコミット済みメモリがそれぞれ返されます。 の意味の簡単な説明は次のとおりです。

  • 初期:起動時にJVMがOSに要求する初期メモリ
  • 使用済み:JVMによって使用されている現在のメモリ量
  • 最大:JVMで使用可能な最大メモリ。 この制限に達すると、OutOfMemoryExceptionがスローされる可能性があります
  • コミット済み:JVMで使用可能であることが保証されているメモリの量

5. CPU使用率

次に、 ThreadMXBeanを使用してThreadInfoオブジェクトの包括的なリストを取得し、クエリを実行して現在のスレッドに関する有用な情報を取得します。 ]JVMで実行されています。

ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();

for(Long threadID : threadMXBean.getAllThreadIds()) {
    ThreadInfo info = threadMXBean.getThreadInfo(threadID);
    System.out.println("Thread name: " + info.getThreadName());
    System.out.println("Thread State: " + info.getThreadState());
    System.out.println(String.format("CPU time: %s ns", 
      threadMXBean.getThreadCpuTime(threadID)));
  }

まず、コードはgetAllThreadIdsメソッドを使用して現在のスレッドのリストを取得します。 次に、スレッドごとに、スレッドの名前と状態に続いて、スレッドのCPU時間をナノ秒単位で出力します。

6. プロファイラーを使用したメトリックの監視

最後に、 Javaコードを使用せずに、これらの主要なメトリックを監視できることを言及する価値があります。 Javaプロファイラーは、JVMレベルで主要な構成と操作を綿密に監視し、メモリー、スレッドなどのリアルタイム分析を提供します。

VisualVMはJavaプロファイラーのそのような例の1つであり、Java6以降JDKにバンドルされています。  多くの統合開発環境(IDE)には、新しいコードの開発中にプロファイラーを活用するためのプラグインが含まれています。 JavaプロファイラーとVisualVMの詳細については、こちらをご覧ください。

7. 結論

この記事では、コアJava APIを使用して、ディスク使用量、メモリ管理、およびスレッド情報に関する重要な情報を照会する方法について説明しました。

ファイルおよびManagmentFactoryクラスを使用してこれらのメトリックを取得する複数の例を見てきました。