J'ai une application Java 7 utilisant JVM ARGS: -Xms1024m -Xmx2048m
, et ça fonctionne plutôt bien.
Après la mise à niveau vers Java 8, il est exécuté en état d'erreur avec 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)
Je me demande si JVM ARGS -Xms1024m -Xmx2048m
fonctionne toujours?
Depuis Java 8 a supprimé la génération permanente: http://www.infoq.com/articles/Java-PERMGEN-Removed , je pense que la stratégie/la mémoire du GC diffère la gestion entre Java 7 et Java 8 peut en être la cause fondamentale. Y a-t-il une suggestion?
En raison de la suppression de PermGen, certaines options ont été supprimées (comme -XX:MaxPermSize
), mais les options -Xms
et -Xmx
work in Java 8. Il est possible que sous Java 8 votre application nécessite simplement un peu plus de mémoire. Essayez d’augmenter -Xmx
valeur. Sinon, vous pouvez essayer de passer au collecteur de déchets G1 en utilisant -XX:+UseG1GC
.
Notez que si vous utilisez une option qui a été supprimée dans Java 8, un avertissement s’affiche au démarrage de l’application:
$ 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)
Ce que je sais, c’est l’une des raisons pour lesquelles une erreur "dépassement de la limite de dépassement du CPG" est renvoyée lorsque 2% de la mémoire est libérée après plusieurs cycles de CPG.
Par cette erreur, votre machine virtuelle Java indique que votre application passe trop de temps dans le nettoyage de la mémoire. ainsi, le peu de ressources que GC a pu nettoyer va être rapidement rempli à nouveau, obligeant ainsi GC à reprendre le processus de nettoyage.
Vous devriez essayer de changer la valeur de -Xmx
et -Xms
.