JVM ARGS’-Xms1024m -Xmx2048m’在Java 8中仍然有用吗?

我有一个使用JVM ARGS的Java 7应用程序: -Xms1024m -Xmx2048m ,它运行得很好。

升级到Java 8后,它以exception方式运行在错误状态:

 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之间的不同GC策略/内存管理可能是根本原因。 有什么建议吗?

由于删除了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) 

我所知道的是当在几个GC循环后释放2%的内存时抛出“GC开销超出限制”错误的一个原因

通过此错误,您的JVM发出信号表明您的应用程序在垃圾收集中花费了太多时间。 因此,能够清洁的少量GC将再次快速填充,从而迫使GC再次重新开始清洁过程。

您应该尝试更改-Xmx-Xms的值。