オーダーメイドコース
icon
icon

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

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

テックアカデミーマガジンは受講者数No.1のプログラミングスクール「テックアカデミー」が運営。初心者向けにプロが解説した記事を公開中。現役エンジニアの方はこちらをご覧ください。 ※ アンケートモニター提供元:GMOリサーチ株式会社 調査期間:2021年8月12日~8月16日  調査対象:2020年8月以降にプログラミングスクールを受講した18~80歳の男女1,000名  調査手法:インターネット調査

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

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

 

そもそもJavaについてよく分からないという方は、Javaとは何なのか解説した記事を読むとさらに理解が深まります。
 

なお本記事は、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] 未経験からWebエンジニアを目指す方法とは

監修してくれたメンター

堀田 悠貴

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

 

大石ゆかり

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

田島悠介

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

大石ゆかり

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

TechAcademyでは、初心者でもJavaやServletの技術を使ってWebアプリケーション開発を習得できるオンラインブートキャンプJava講座を開催しています。

挫折しない学習方法を知れる説明動画や、現役エンジニアとのビデオ通話とチャットサポート、学習用カリキュラムを体験できる無料体験も実施しているので、ぜひ参加してみてください。