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上での手順は下記の通りです。
- 対象プログラムのメインクラスを一度実行。
- 実行ボタン横の▼ボタンで開くメニューから「実行構成…」を選択して子画面を起動。
- 左側ツリーに対象のクラスの実行構成があるのでそれを選択する。
- 「引数」タブの「VM引数」の欄に「-Xms」「 -Xmx」オプションを入力。(例)-Xms1m -Xmx3m
- 「適用」ボタンを押して子画面を閉じる。
上記手順後は実行時のヒープ領域が常に指定したサイズになります。
オプションによって指定しない場合、ヒープ領域の最大サイズは実行環境の物理メモリ容量の何分の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」の発生する、しないが変わることを確認してみて下さい。
監修してくれたメンター
堀田 悠貴
以前はSEとして某大学病院の電子カルテシステムの保守・開発に携わっていました。 |
内容分かりやすくて良かったです!
ゆかりちゃんも分からないことがあったら質問してね!
分かりました。ありがとうございます!
TechAcademyでは、初心者でもJavaやServletの技術を使ってWebアプリケーション開発を習得できるオンラインブートキャンプJava講座を開催しています。
挫折しない学習方法を知れる説明動画や、現役エンジニアとのビデオ通話とチャットサポート、学習用カリキュラムを体験できる無料体験も実施しているので、ぜひ参加してみてください。