Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaプログラムで使用中のメモリ量を確認し、ヒープ不足を防ぐ方法

長時間稼働し、動的メモリを大量に消費するJavaプログラムでは、ヒープ領域のメモリ不足によってOutOfMemoryError(メモリ不足エラー)が発生する可能性があります。これを防ぐためには、プログラム自身がメモリ使用状況を監視し、必要に応じて対処することが有効です。

以下のサンプルプログラムでは、Javaプログラムが現在使用しているヒープ領域の使用率を確認できます。ヒープの使用率が90%を超えた場合、ガベージコレクタ(GC)を明示的に呼び出す仕組みになっています。

なお、System.gc()はガベージコレクションが完了するまで呼び出し元のスレッドをブロックします。そのため、実際のアプリケーションでは、この処理を別スレッドで実行することを推奨します。

サンプルコード

public class GCTest {
    public void runGC() {
        Runtime runtime = Runtime.getRuntime();
        long memoryMax = runtime.maxMemory();
        long memoryUsed = runtime.totalMemory() - runtime.freeMemory();
        double memoryUsedPercent = (memoryUsed * 100.0) / memoryMax;
        System.out.println("memoryUsedPercent: " + memoryUsedPercent);
        if (memoryUsedPercent > 90.0)
            System.gc();
    }
    public static void main(String args[]) {
        GCTest test = new GCTest();
        test.runGC();
    }
}

実行結果

memoryUsedPercent: 0.07187129404943532

使用している主要なAPIの解説

  • Runtime.getRuntime():現在のJava仮想マシン(JVM)に関連付けられたRuntimeオブジェクトを取得します。
  • maxMemory():JVMが利用できる最大ヒープサイズ(バイト数)を返します。
  • totalMemory():現在JVMに割り当てられているメモリの総量を返します。
  • freeMemory():割り当て済みメモリのうち、まだ使用されていない空き容量を返します。

使用中メモリは「totalMemory() − freeMemory()」で算出でき、これをmaxMemory()で割ることでヒープ全体に対する使用率(%)が求められます。

注意点

System.gc()の呼び出しはあくまでJVMへの「提案」であり、必ずしも即座にGCが実行される保証はありません。また、GCの実行はアプリケーションのパフォーマンスに影響を与える可能性があるため、本番環境での頻繁な呼び出しは避け、あくまで補助的な対策として活用することが望ましいでしょう。根本的なメモリ不足の解決には、ヒープサイズの見直し(-Xmxオプションなど)やメモリリークの調査も併せて検討してください。

  1. コマンドプロンプトからJavaプログラムを実行する方法【初心者向け完全ガイド】

    Javaは最も広く使われているプログラミング言語のひとつです。Eclipseとの緊密な連携に代表されるようにIDEを活用した開発が主流ですが、実はコマンドプロンプトからでも手軽にコンパイルと実行を行えます。 これからJavaの学習を始める方のために、WindowsのコマンドプロンプトからJavaアプリケーションを実行するための基本手順をわかりやすく解説します。 Java開発キット(JDK)のインストール パソコンでJavaプログラムを実行するには、専用のコンパイラが必要です。このコンパイラはJava Development Kit(JDK)に含まれており、プラットフォームを問わずJava開発

  2. Javaでカウンタープログラムを実装する方法をわかりやすく解説

    この記事では、JavaのSwingを使ってシンプルなカウンター(数を数える)アプリケーションを実装する方法を解説します。このプログラムでは、JLabelでカウント用のラベルを表示し、JTextFieldで現在のカウント値を保持し、JButtonで「追加(Add)」「削除(Remove)」「リセット(Reset)」の3つのボタンを作成します。 「Add」ボタンをクリックするとJTextField内のカウントが1ずつ増加し、「Remove」ボタンをクリックすると1ずつ減少します。さらに「Reset」ボタンをクリックすると、カウントは0にリセットされます。 実装例 import java.awt.*