2017-08-23 3 views
0

Je travaille sur le traitement d'image numérique. quand j'ai essayé avec des images de résolution plus élevée avec la charge, je reçois beaucoup de problèmes d'OOM.Pouvons-nous déclencher le GC complet manuellement ou avec un paramètre à un pourcentage de tas, est-ce que cela est suggestible?

J'utilise ces paramètres de démarrage avec l'application

-Xms10240m -Xmx10240m -XX:NewRatio=3 -XX:+PrintFlagsFinal -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=80 -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:+PrintGCDetails -XX:+PrintGCTimeStamps 

Je ne peux pas abordable pour augmenter la mémoire de tas. Donc, puis-je déclencher manuellement Full à un pourcentage de tas, Si possible. manuel de fonctionnement est opération suggestible ??

+3

Une récupération de place ne va pas vous aider avec un MOO .. – NickL

+3

Le GC est toujours fait avant qu'un 'OOM' ne soit lancé, vous n'avez donc pas assez de mémoire. Obtenez plus de mémoire ou modifiez votre programme pour utiliser moins de mémoire. – Kayaman

Répondre

1

Vous pouvez demander à la machine virtuelle Java de déclencher le mode GC à l'aide d'un appel à System.gc(). Les docs de l'API disent que ceci, "suggère que la machine virtuelle Java déploie des efforts pour recycler les objets inutilisés". Si vous utilisez la JVM HotSpot d'Oracle, il exécutera un GC complet chaque fois que vous l'appelez.

Cependant, il est peu probable (comme cela a été dit dans les commentaires) de résoudre votre problème. Le GC est très bon pour récupérer de l'espace qui n'est plus nécessaire, donc l'exception de MOO que vous obtenez est très probablement due au fait que vous n'avez que 1 Go de mémoire pour votre tas. Quelle est la taille de vos images et combien en essayez-vous simultanément? Vous devriez être capable de faire quelques calculs simples pour calculer la taille minimum de tas dont vous avez besoin.

Vous avez les deux arguments suivants:

-XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=80 

Cela signifie que la machine virtuelle Java est en attente jusqu'à ce que le tas est plein à 80% avant de lancer le collecteur simultané. Essayez d'abaisser cela. Aucune garantie, mais cela peut améliorer les choses.