修正:VMの初期化中にエラーが発生し、オブジェクトヒープ用に十分なスペースを予約できなかった

最近のJavaアプレットは人気のあるWebテクノロジーではありませんが、Java仮想マシンをLinuxサーバーに直接デプロイする理由は無数にあります。個別のハードウェアまたは独自のVMの内部でLinux Javaコマンドを完全に実行しようとすると、「VMの初期化中にエラーが発生し、オブジェクトヒープ用の十分なスペースを確保できませんでした」というメッセージが表示される場合があります。

コマンドを実行するのに十分なRAMを持っている可能性が高いため、これはおそらく奇妙に見えますが、それは主に、物理メモリページと仮想メモリページが使用される特定の癖によるものです。比較的大きなサイズを指定すると、このメッセージを完全にバイパスして、他の方法でjavaコマンドを実行できます。

方法1:コマンドラインオプションを使用する

javaを実行してこのメ​​ッセージを受け取った場合は、おそらくfreeコマンドを実行して、プログラムを実行するための十分なメモリが確保されていることを確認していることでしょう。

java&freeコマンド

テストマシンには約2.3 GBの物理RAMがあり、仮想メモリの単一のページはまだ使用されていません。メモリが不足していることに気付いた場合は、実行している他のものを閉じてから、再試行してください。一方、十分な空きメモリがあることを発見した人は、サイズを直接指定することができます。

たとえば、私たちのマシンでは、コマンドをjava -Xms256m -Xmx512Mとして実行することができました。これにより、Java仮想マシンが起動時に予約しようとするヒープサイズが制限されます。制限されていない仮想マシンは仮想的に異常な動作をする可能性があるため、それ以外の場合はフリーのシステムでエラーメッセージをスローする可能性があります。また、適切な組み合わせを見つける前に、これら2つの値を試してみることもできます。

JVMは、GNU / Linuxの実行に使用している可能性のあるVMのタイプとは何の関係もないため、これを実行しているものに関係なく、問題になる可能性があります。

方法2:変数をエクスポートして変更を永続的にする

機能する値を見つけたら、それをエクスポートして、そのセッションで永続的にすることができます。たとえば、bashコマンドプロンプトからexport _JAVA_OPTIONS = '-Xms256M -Xmx512M'を使用すると、サーバーからログアウトするまで、他のオプションなしでjavaコマンドを単独で実行できます。

別のセッションにログインしたときに再度実行する必要があるため、javaコマンドを頻繁に使用する予定がある場合は、関連する起動スクリプトに追加することをお勧めします。この行を.bash_loginファイルに追加しました。ログインプロンプトを使用するたびに、再度実行する必要はなく、動作するように見えましたが、別のシェルを使用している場合は、別の場所を見つける必要があるかもしれません。

特定のハードウェア構成のみがこのエラーメッセージをトリガーすることに気づいたかもしれません。これは通常、物理RAMが大量にあるが、使用方法のulimitが低いマシンで発生するためです。Javaは巨大なブロックを割り当てようとしますが、それはできないことを通知するだけであり、メモリが不足していると解釈します。

方法3:現在のJavaオプションを印刷する

コマンドラインで作業していて、現在_JAVA_OPTIONS値を設定している内容へのクイックリファレンスが必要な場合は、echo $ _JAVA_OPTIONSを実行するだけで、現在の値がすぐに出力されます。これは、正しい数字を試してみる際のトラブルシューティングに役立ちます。

この修正では他の操作は必要ありませんが、仮想メモリの短い部分に本当に気づいた場合、Javaは「オブジェクトヒープ用に十分なスペースを予約できませんでした」というメッセージをスローします。この場合は、現在実行中のプロセスを再確認し、可能であればサーバーを再起動してください。さらに多くのスワップ領域を作成することもできますが、これが問題である場合は、他の方法で試し、修正することをお勧めします。

設定は正しいように見えても、それでも機能しないというまれなケースでは、この問題の影響を受けないはずなので、64ビットJavaパッケージがインストールされていることを確認してください。連続メモリ要件は、32ビットバージョンのJavaにのみ適用されます。64ビットバージョンで32ビットの仮想マシンを作成しようとしたケースがいくつかありました。そのため、コマンドラインで-d64オプションを指定すると修正されました。