1. 概要

このチュートリアルでは、いくつかの考えられるシナリオを実行しながら、「オブジェクトヒープ用に十分なスペースを予約できませんでした」エラーの原因を学習します。

2. 症状

「オブジェクトヒープ用に十分なスペースを予約できませんでした」は、実行中のシステムで発生したメモリの制約のためにJavaプロセスが仮想マシンを作成できない場合に発生する特定のJVMエラーです:

java -Xms4G -Xmx4G -jar HelloWorld.jar

Error occurred during initialization of VM
Could not reserve enough space for object heap
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

一般に、エラーが発生した場合、2つのシナリオが考えられます。 まず、最大ヒープサイズ制限パラメーター(-Xmx)を使用してJavaプロセスをランチすると、値オペレーティングシステムでプロセスが持つことができる値よりも大きくなります[X178X ]。

ヒープサイズの制限は、いくつかの制約に基づいて異なります。

  • ハードウェアアーキテクチャ(32/64ビット)
  • JVMビットバージョン(32/64ビット)
  • 私たちが使用するオペレーティングシステム

次に、同じシステムで実行され、メモリを消費する他のアプリケーションが原因で、Javaプロセスが指定された量のメモリを予約できない場合。

3. ヒープサイズ

Java ヒープスペースは、JVM自体によって管理されるランタイムJavaプログラムのメモリ割り当てプールです。 デフォルトでは、 割り当てプールは、初期サイズと最大サイズに制限されています。 Javaのヒープスペースの詳細については、以下を参照してください。 この記事はこちら

さまざまな環境での最大ヒープサイズと、制限を設定する方法を見てみましょう。

3.1. 最大ヒープサイズ

32ビットおよび64ビットJVMの理論上の最大ヒープ制限は、使用可能なメモリスペース(32ビットJVMの場合は2 ^ 32(4 GB)、64ビットの場合は2 ^ 64(16エクサバイト))を調べることで簡単に決定できます。ビットJVM。

実際には、さまざまな制約により、制限ははるかに低くなる可能性があり、オペレーティングシステムによって異なります。 たとえば、 32ビットWindowsシステムでは、最大ヒープサイズの範囲は1.4 GB〜1.6GBです。 対照的に、32ビットLinuxシステムでは、最大ヒープサイズは最大3GBまで拡張できます。

このため、アプリケーションで大きなヒープが必要な場合は、64ビットJVMを使用する必要があります。 ただし、ヒープが大きい場合、ガベージコレクターはより多くの作業を行う必要があるため、ヒープサイズとパフォーマンスのバランスをとることが重要です。

3.2. ヒープサイズの制限を制御する方法は?

JVMのヒープサイズ制限を制御するための2つのオプションがあります。

まず、各JVM初期化でJavaコマンドラインパラメーターを使用します。

-Xms<size>    Sets initial Java heap size. This value must be a multiple of 1024 and greater than 1 MB.
-Xmx<size>    Sets maximum Java heap size. This value must be a multiple of 1024 and greater than 2 MB.
-Xmn<size>    Sets the initial and maximum size (in bytes) of the heap for the young generation.

サイズ値には、文字kまたはKmまたはMおよびgまたは[ X110X] G は、それぞれキロバイト、メガバイト、およびギガバイトを示します。 文字が指定されていない場合は、デフォルトの単位(バイト)が使用されます。

-Xmn2g
-Xmn2048m
-Xmn2097152k
-Xmn2147483648

次に、環境変数 JAVA_OPTS を使用して、上記のJavaコマンドラインパラメーターをグローバルに構成します。 このため、システム上の各JVM初期化では、環境変数に設定された構成が自動的に使用されます。

JAVA_OPTS="-Xms256m -Xmx512m"

詳細については、包括的なJVMパラメーターガイドをご覧ください。

4. 結論

このチュートリアルでは、JVMがオブジェクトヒープ用に十分なスペースを予約できない場合に考えられる2つのシナリオについて説明しました。 また、このエラーを軽減するためにヒープサイズの制限を制御する方法も学びました。

次に、実行時の潜在的なメモリの問題とそれらを特定する方法について詳しく学びます。