2017-08-11 5 views
2

アップグレード時にOutOfMemoryErrorが発生しました。 JVMの設定は、正常に機能していたJava 7と同じに保たれます。ここでjava.lang.OutOfMemoryError:Java 7からJava 8への移行後のメタスペースエラー

は、JBoss 4.2サーバーの設定です:Javaの7の

-server -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000 -Xms4096m -Xmx7168m -XX:MaxMetaspaceSize=512m -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -Djava.security.egd=file:///dev/urandom

唯一の違いはXXです:MaxMetaspaceSize = 512メートルPermGen最大で置き換えました。

サーバーが&アプリケーションが同じであるため、クラスロードのためのメタスペースがもっと必要なのはなぜですか?Javaバージョンでのみ変更します。&

+0

エラーのスタックトレースはありますか? OOMの正確なエラーを知りたい。 –

+1

Java 8でJBossを起動すると、正確なJavaパラメータを提供できますか? – DevDio

+0

使用されているJavaのパラメータが追加されました。-server -Dsun.rmi.dgc.client.gcInterval = 3600000 -Dsun.rmi.dgc.server.gcInterval = 3600000 -Xms4096m -Xmx7168m -XX:MaxMetaspaceSize = 512m -XX:+ UseConcMarkSweepGC -XX:+ CMSClassUnloadingEnabled -Djava.security.egd = file:/// dev/urandom –

答えて

1

私の考えであることは、java8はラムダを使用し、すべてのラムダはJava 8のクラスです。私が間違っていても正解ですが、私の検査ではjava8アプリケーションのクラス図を作成するときに見えます。したがって、java8はより多くのクラス・メモリーを使用します。

+0

展開されたコードはラムダを使用していません。 –

3

おそらく-XX:MaxMetaspaceSize=512mを削除する必要があります。

Java 7では、を増やす必要があります。デフォルトの最大値が低すぎたため、永久に世代を稼働させる世代が増えました。

Java 8では、クラスを保持するメタスペースは、デフォルトでは無制限に拡張できるため、Java 7の問題を最初に解決しようとしていない可能性があります。代わりに、経験したように、別の問題にぶつかります。メタスペースの制限を低く設定する。この制限を削除すると、おそらく問題が解決され、JVMが適切な決定を下すことができます。

this answerも参照してください。

+0

MaxMetaspaceSizeを削除すると、メタスペースの使用量が3gまで増加しました。サーバーは7gで割り当てられた8gと最大のヒープを持っていたので、別のメモリークラッシュが発生しました。メタスペースガベージのデッドクラスローダーは収集されていますか?それを制御する設定はありますか? –

+1

メタスペースのガベージコレクションを強制するために '-XX:MaxMetaspaceExpansion = 0'を設定することもできます(https://stackoverflow.com/a/31632341/942774を参照)。しかし、まだ誰かがクラスオブジェクトを保持している場合、とても良いことをする。 – hendrik

+0

-XX:MaxMetaspaceExpansion = 0に設定しても結果は同じです。合計= 1394 27716 53490569 N/A生存= 1、死亡= 1393 N/A。私はガベージコレクションが非ヒープメモリ上で頻繁に実行されるのを見ています。私はこれらの多くの死んだクラスのローダーはなぜ次に疑問に思う? –

関連する問題