JVM ARGS '-Xms1024m -Xmx2048m' 在 Java 8 中是否仍然有用?
Is JVM ARGS '-Xms1024m -Xmx2048m' still useful in 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 之间的不同GC strategy/memory 管理可能是根本原因。有什么建议吗?
由于删除了 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 overhead limit exceeded”错误的原因之一
通过此错误,您的 JVM 表明您的应用程序在垃圾收集上花费了太多时间。因此 GC 能够清理的少量数据将很快再次被填满,从而迫使 GC 再次重新启动清理过程。
您应该尝试更改 -Xmx
和 -Xms
的值。
我有一个使用 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 之间的不同GC strategy/memory 管理可能是根本原因。有什么建议吗?
由于删除了 PermGen,一些选项被删除(如 -XX:MaxPermSize
),但选项 -Xms
和 -Xmx
在 Java 8 中工作。在 Java 8 您的应用程序只需要更多的内存。尝试增加 -Xmx
值。或者,您可以尝试使用 -XX:+UseG1GC
.
请注意,如果您使用在 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 overhead limit exceeded”错误的原因之一
通过此错误,您的 JVM 表明您的应用程序在垃圾收集上花费了太多时间。因此 GC 能够清理的少量数据将很快再次被填满,从而迫使 GC 再次重新启动清理过程。
您应该尝试更改 -Xmx
和 -Xms
的值。