Javaでのディスク使用量とその他のメトリックの監視
1. 概要
このクイックチュートリアルでは、Javaで主要なメトリックを監視する方法について説明します。 disk space, memory usage, and thread data – using only core Java APIsに焦点を当てます。
最初の例では、Fileクラスを使用して特定のディスク情報をクエリします。
次に、ManagementFactoryクラスに飛び込んで、メモリ使用量とプロセッサ情報を分析します。
最後に、how to monitor these key metrics at runtime using Java Profilersについて説明します。
2. Fileクラスの概要
簡単に言えば、File class represents an abstraction of a fileまたはディレクトリです。 ファイルパスに関してobtain key information about the file system and maintainOS independenceに使用できます。 このチュートリアルでは、このクラスを使用して、WindowsマシンとLinuxマシンの両方のルートパーティションを調べます。
3. ManagementFactory
Java provides the ManagementFactory class as a factory for getting managed beans(MXBeans)containingspecific information about the JVM。 次のコード例では、2つを調べます。
3.1. MemoryMXBean
JVMのメモリシステムのMemoryMXBean represents the management interface。 実行時に、JVMはこのインターフェースの単一インスタンスを作成します。これはManagementFactoryのgetMemoryMXBean()メソッドを使用して取得できます。
3.2. ThreadMXBean
MemoryMXBeanと同様に、ThreadMXBeanはJVMのスレッドシステムの管理インターフェイスです。 getThreadMXBean()メソッドを使用して呼び出すことができ、スレッドに関する重要なデータを保持します。
次の例では、ThreadMXBeanを使用して、JVMのThreadInfo class – which contains specific information regarding threads running on the JVM.を取得します。
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));
同様に、root directory of a Linux machineについても同じ情報を返すことができます。
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 class toquery the memory available to the JVM by calling the MemoryMXBeanを使用します。
この例では、主にヒープメモリのクエリに焦点を当てます。 非ヒープメモリも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));
上記の例は、それぞれinitial、used、max、committed memoryを返します。 meansが何であるかについて簡単に説明します。
-
初期:JVMが起動時にOSに要求する初期メモリ
-
使用済み:JVMによって使用されている現在のメモリ量
-
最大:JVMで使用可能な最大メモリ。 この制限に達すると、OutOfMemoryException がスローされる可能性があります
-
コミット済み:JVMが使用できることが保証されているメモリの量
5. CPU使用率
次に、JVMで実行されているThreadMXBean to gain a comprehensive list of ThreadInfoオブジェクトとquery them to gainuseful information regarding thecurrent threadsを使用します。
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. プロファイラーを使用したメトリックの監視
最後に、we can monitor these key metrics without using any Java codeについて言及する価値があります。 Javaプロファイラは、JVMレベルで主要な構成要素と操作を厳密に監視し、メモリ、スレッドなどのリアルタイム分析を提供します。
VisualVMは、Javaプロファイラーのそのような例の1つであり、Java 6以降、JDKにバンドルされています。 多くの統合開発環境(IDE)には、新しいコードの開発中にプロファイラーを活用するためのプラグインが含まれています。 JavaプロファイラーとVisualVMのhereについて詳しく知ることができます。
7. 結論
この記事では、コアJava APIを使用して、ディスク使用量、メモリ管理、スレッド情報に関する重要な情報をクエリする方法について説明しました。
File クラスとManagmentFactory クラスを使用してこれらの指標を取得する複数の例を見てきました。