web-dev-qa-db-ja.com

JVM ARGS '-Xms1024m -Xmx2048m'はJava 8でもまだ有用ですか?

JVM ARGSを使用するJava 7アプリケーションがあります:-Xms1024m -Xmx2048m、それは非常にうまく動作します。

Java 8にアップグレードした後、次の例外を含むエラー状態で実行されます。

Exception in thread "main" Java.lang.OutOfMemoryError: GC overhead limit exceeded
    at org.hibernate.engine.StatefulPersistenceContext.addEntry(StatefulPersistenceContext.Java:466)
    at org.hibernate.engine.TwoPhaseLoad.postHydrate(TwoPhaseLoad.Java:80)
    at org.hibernate.loader.Loader.loadFromResultSet(Loader.Java:1439)
    at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.Java:1332)
    at org.hibernate.loader.Loader.getRow(Loader.Java:1230)
    at org.hibernate.loader.Loader.getRowFromResultSet(Loader.Java:603)
    at org.hibernate.loader.Loader.doQuery(Loader.Java:724)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.Java:259)
    at org.hibernate.loader.Loader.doList(Loader.Java:2228)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.Java:2125)
    at org.hibernate.loader.Loader.list(Loader.Java:2120)
    at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.Java:118)
    at org.hibernate.impl.SessionImpl.list(SessionImpl.Java:1596)
    at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.Java:306)

JVM ARGS -Xms1024m -Xmx2048mがまだ機能しているかどうか疑問に思っていますか?

Java 8によってPerm Generationが削除されたため、 http://www.infoq.com/articles/Java-PERMGEN-Removed で、_Java 7およびJava 8が根本原因である可能性があります。何か提案はありますか?

27
coderz

PermGenの削除により、いくつかのオプションが削除されました(-XX:MaxPermSizeなど)が、オプション-Xmsおよび-XmxはJava 8で機能します。Java 8ではアプリケーションは、いくぶんより多くのメモリを必要とします。 -Xmx値を増やしてみてください。または、-XX:+UseG1GCを使用してG1ガベージコレクターに切り替えることもできます。

Java 8で削除されたオプションを使用すると、アプリケーションの起動時に警告が表示されることに注意してください。

$ Java -XX:MaxPermSize=128M -version
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=128M; support was removed in 8.0
Java version "1.8.0_25"
Java(TM) SE Runtime Environment (build 1.8.0_25-b18)
Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)
25
Tagir Valeev

私が知っているのは、いくつかのGCサイクルの後にメモリの2%が解放されたときに「GCオーバーヘッド制限を超えました」エラーがスローされる理由の1つです

このエラーにより、JVMは、アプリケーションがガベージコレクションに多くの時間を費やしていることを通知しています。そのため、GCがクリーニングできなかった少量がすぐに再びいっぱいになり、GCがクリーニングプロセスを再開します。

-Xmx-Xmsの値を変更してみてください。

2
Ankur Anand