Java 8中JVM参数“-Xms1024m -Xmx2048m”仍然有用吗?

30

我有一个使用JVM参数-Xms1024m -Xmx2048m的Java 7应用程序,运行得非常好。

但是当我升级到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策略/内存管理可能是根本原因。是否有任何建议?


Xms和Perm Size有什么关系吗? - Ankur Anand
3
@AnkurAnand Xms和Perm大小没有关系。 - coderz
那么为什么要担心它与Perm Generation有关呢? - Ankur Anand
@AnkurAnand 我已经更新了问题,避免了不清晰的逻辑描述。 - coderz
2个回答

31
由于PermGen的移除,一些选项也被移除了(例如-XX:MaxPermSize),但是在Java 8中,-Xms-Xmx仍然适用。可能在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)

5
G1垃圾收集器有什么好处? - coderz
5
在这个特定的情况下,与CMS不同,G1垃圾收集器没有两个幸存区,其中一个是不可访问的。实际上,在相同的Xmx值下,G1收集器为应用程序提供更多的内存。如果您想了解有关G1的更多细节,请提出单独的问题,这个评论字段对于这样的讨论来说太短了。 - Tagir Valeev
经常被忽视并且会被踩踏的是那些询问主观问题的问题,所以这个问题在这里看起来是完全合理的。既然它被提供作为长期运行的“-Xms|-Xmx”标记的替代品,因此解决方案需要更多的背景信息。 :) - tresf

2
我所知道的是,“GC overhead limit exceeded”错误被抛出的一个原因是在几个GC周期后释放了2%的内存。这个错误意味着你的JVM正在表明你的应用程序在垃圾回收上花费了太多时间。因此,GC能够清理的少量内存将很快再次被填满,从而迫使GC重新启动清理过程。你应该尝试更改“-Xmx”和“-Xms”的值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接