Javaでヒープ領域不足のエラーJava heap spaceを解決する方法【初心者向け】

初心者向けにJavaでヒープ領域不足のエラー java.lang.OutOfMemoryError: Java heap spaceを解決する方法について解説しています。ヒープ領域とは動的に確保できるメモリの領域のことを言います。エラーが出た場合の原因の見かた、解決の方法について実際の例を見ながら学びましょう。

TechAcademyマガジンはオンラインのプログラミングスクールTechAcademy [テックアカデミー]が運営する教育×テクノロジーのWebメディアです。初心者でもすぐ勉強できる記事が2,000以上あります。

この記事では、Javaでヒープ領域不足のエラー java.lang.OutOfMemoryError: Java heap spaceを解決する方法について解説します。

実際にプログラムを書いて説明しているので、ぜひ理解しておきましょう。

 

なお本記事は、TechAcademyのJava講座の内容をもとに作成しています。

 

田島悠介

今回は、Javaに関する内容だね!

大石ゆかり

どういう内容でしょうか?

田島悠介

ヒープ領域不足のエラー java.lang.OutOfMemoryError: Java heap spaceを解決する方法について詳しく説明していくね!

大石ゆかり

お願いします!

 

ヒープ領域とは

Javaプログラムは全て、Java仮想マシン(=JVM)という仕組みによって実行されます。

このJVMがプログラム実行時に確保するメモリ領域のうち、実行時に生成するオブジェクトのために割り当てられる領域をヒープ領域といいます。

この領域が十分に確保されていないと、メモリからオブジェクト情報を破棄する頻度が上がったり、メモリ不足によるエラーでプログラムが終了してしまったりします。

このメモリ不足による異常終了の際は「java.lang.OutOfMemoryError」というエラーがコンソールに表示されます。

ヒープ領域不足のエラーを解決する方法

プログラムがメモリ不足で落ちてしまった場合、ヒープ領域のサイズを増やすことで解決することができます。

ヒープ領域のサイズはJVMの実行時オプションで指定することができます。

(例)

java -Xms1m -Xmx3m メインクラス名

コマンドを打ってプログラムを実行する場合は上記の様にヒープ領域のサイズを指定します。

「-Xms」はヒープ領域の初期サイズを、「-Xmx」は最大サイズを指定する際に使用します。

上記の例では初期サイズを1m(1メガバイト)、最大サイズを3m(3メガバイト)に指定しています。

Eclipse上でプログラムを実行する場合は、実行構成の設定画面からヒープ領域のサイズ指定ができます。

Eclipse上での手順は下記の通りです。

  1. 対象プログラムのメインクラスを一度実行。
  2. 実行ボタン横の▼ボタンで開くメニューから「実行構成…」を選択して子画面を起動。
  3. 左側ツリーに対象のクラスの実行構成があるのでそれを選択する。
  4. 「引数」タブの「VM引数」の欄に「-Xms」「 -Xmx」オプションを入力。(例)-Xms1m -Xmx3m
  5. 「適用」ボタンを押して子画面を閉じる。

上記手順後は実行時のヒープ領域が常に指定したサイズになります。

オプションによって指定しない場合、ヒープ領域の最大サイズは実行環境の物理メモリ容量の何分の1かが自動的に割り当てられます。

 

実際に書いてみよう

下記のプログラムはString型のオブジェクトが格納する文字列を徐々に増やしていき、1000000字まで増やすと終了します。

最初に普通に実行して、正常終了することを確認してください。その後、ヒープ領域のサイズを「-Xms1m -Xmx1m」と設定して実行してください。

プログラムが途中で終了して、「java.lang.OutOfMemoryError」がコンソールに表示されるはずです。

次にヒープ領域のサイズを「-Xms1m -Xmx10m」と設定して実行してください。今度はプログラムが最後まで処理され正常終了されるはずです。

ソースコード

public class HeapTest {

  public static void main(String[] args) {
    String s1 = new String();
    String s2 = new String();

    for (int i = 0; i < 1000; i++) {
      s1 = s1.concat("a");
    }

    for (int i = 0; i < 1000; i++) {
      s2 = s2.concat(s1);
      System.out.println(s2.length());
    }

    System.out.println("プログラム正常終了");
  }

}

ヒープ領域のサイズやループ回数を変えることで「java.lang.OutOfMemoryError」の発生する、しないが変わることを確認してみて下さい。

 

[PR] Javaで挫折しない学習方法を動画で公開中

監修してくれたメンター

堀田 悠貴

以前はSEとして某大学病院の電子カルテシステムの保守・開発に携わっていました。
基本的にJavaを使用してクライアント側のプログラム開発を担当していました。
基本業務はJavaでしたが案件次第で色々他のことにも手を出す必要があり、その都度苦労した記憶があります。
現在はその会社を退社して、こちらでのメンター業務のみ行っています。

 

大石ゆかり

内容分かりやすくて良かったです!

田島悠介

ゆかりちゃんも分からないことがあったら質問してね!

大石ゆかり

分かりました。ありがとうございます!

また、オンラインのプログラミングスクールTechAcademyでは、Java講座を開催しています。

JavaやServletの技術を使ってWebアプリケーションの開発を学ぶことができます。

現役エンジニアがパーソナルメンターとして受講生に1人ずつつき、マンツーマンのメンタリングで学習をサポートし、最短4週間で習得することが可能です。

また、現役エンジニアから学べる無料のプログラミング体験会も実施しているので、ぜひ参加してみてください。