Existe-t-il une option de journal permettant à Tomcat de consigner la mauvaise requête au lieu de le lancer?
SEVERE: Java.lang.OutOfMemoryError: la taille du tableau demandé dépasse _ la limite VM.
(Niveau de journal essayé à PLEIN, mais ne capturez que ce qui précède)
Ce n'est pas assez d'informations pour poursuivre le débogage
Alternativement, si cela peut être corrigé en allouant plus de mémoire en ajustant les éléments suivants?
-Xms1024M -Xmx4096M -XX: MaxPermSize = 256M
-Xms6G -Xmx6G -XX: MaxPermSize = 1G -XX: PermSize = 512M
(Cela semble mieux fonctionner, continuez à surveiller)
Mettre à niveau la version Solr vers une version plus récente semble résoudre ce problème. Il est probable que la nouvelle version dispose d’une meilleure gestion de la mémoire.
Je suppose que vous utilisez peut-être des tris sur un grand index. C’est une chose qui, à mon avis, peut nécessiter une grande taille de réseau avec Lucene. Quoi qu'il en soit, vous pouvez utiliser une machine virtuelle Java 64 bits avec les options suivantes:
-Xmx6G -XX:MaxPermSize=128M -XX:+UseCompressedOops
La dernière option réduira les pointeurs de mémoire 64 bits à 32 bits (tant que le tas est inférieur à 32 Go). Cela réduit généralement la surcharge de mémoire d'environ 40%. Cela peut donc vous aider à étirer considérablement votre mémoire.
Mise à jour: Il est fort probable que vous n’ayez pas besoin d’une génération aussi nombreuse et permanente, certainement pas de 1G. 128M vous convient probablement, et vous obtiendrez une erreur spécifique si vous passez à Java 6. Puisque votre serveur est limité à 8G, vous pourrez peut-être vous en sortir avec 7G pour le tas avec une plus petite perm gén. Attention à ne pas entrer en échange, cela peut sérieusement ralentir les choses pour Java.
J'ai remarqué que vous n'avez pas mentionné -XX:+UseCompressedOops
dans votre mise à jour. Cela peut faire une énorme différence si vous ne l'avez pas encore essayé. Vous pourrez peut-être libérer un peu plus d'espace en réduisant la taille d'Eden pour donner plus d'espace à la génération titulaire. Au-delà de cela, je pense que vous aurez simplement besoin de plus de mémoire ou moins de champs de tri.
Si vous voulez savoir ce qui cause OutOfMemory, vous pouvez ajouter
-XX:+HeapDumpOnOutOfMemoryError
à votre choix Java.
La prochaine fois que vous manquerez de mémoire, vous obtiendrez un fichier de vidage de tas pouvant être analysé avec "jhat" situé dans jdk/lib. Jhat va vous montrer quels objets existent dans votre tas et combien de mémoire ils consomment.
Vous obtiendrez cette exception parce que vous tentez de créer un groupe plus volumineux que le bloc de mémoire contigu maximum dans votre segment de mémoire de machines virtuelles Java.
https://plumbr.eu/outofmemoryerror/requested-array-size-exceeds-vm-limit
Quelle est la solution?
La taille Java.lang.OutOfMemoryError: La taille du tableau demandée dépasse VM peut apparaître à la suite de l'une des situations suivantes:
Vos baies deviennent trop grandes et finissent par avoir une taille comprise entre la limite de la plate-forme et Integer.MAX_INT
Vous essayez délibérément d’affecter des tableaux de plus de 2 ^ 31-1 éléments pour expérimenter les limites.
Dans le premier cas, vérifiez dans votre base de code si vous avez réellement besoin de tableaux aussi volumineux. Peut-être pourriez-vous réduire la taille des tableaux et en finir avec cela. Ou divisez le tableau en plus petits volumes et chargez les données dont vous avez besoin pour travailler en lots adaptés à votre plate-forme.
Dans le second cas, rappelez-vous que les tableaux Java sont indexés par int. Vous ne pouvez donc pas aller au-delà de 2 ^ 31-1 éléments dans vos tableaux lorsque vous utilisez les structures de données standard de la plate-forme. En fait, dans ce cas, vous êtes déjà bloqué par le compilateur en annonçant «erreur: nombre entier trop grand» lors de la compilation. Mais si vous travaillez vraiment avec de très grands ensembles de données, vous devez repenser vos options. Vous pouvez charger les données dont vous avez besoin pour travailler en lots plus petits tout en utilisant les outils Java standard, ou vous pouvez aller au-delà des utilitaires standard. Une façon d'y parvenir est d'examiner la classe Sun.misc.Unsafe. Cela vous permet d'allouer directement de la mémoire, comme vous le feriez en C.
J'utilise ceci dans catalina.sh
Java_OPTS="-Dsolr.solr.home=/etc/Tomcat6/solr -Djava.awt.headless=true -server -XX:NewSize=256m -XX:MaxNewSize=256m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:+DisableExplicitGC"
Je n’ai jamais eu de problèmes de mémoire sur Tomcat/solr avec 30 millions de petits documents. J'ai eu des problèmes avec le client d'indexation solrJ cependant. Je devais utiliser -Xms8G -Xmx8G
pour le client Java et ajouter des documents par morceaux de 250 000 documents.
Mémoire insuffisante! Voyez s'il y a un tableau hors limites ou faites une boucle si les ressources système sont englouties!
Java.lang.OutOfMemoryError: espace de pile Java Dans la machine virtuelle Java, si 98% du temps est disponible pour la taille de la pile GC et moins de 2% du temps pour émettre ces informations d'exception. Paramètre de segment de la machine virtuelle Java si le programme Java exécute de la mémoire La machine virtuelle Java peut être utilisée pour déployer les paramètres. La machine virtuelle au démarrage définit automatiquement la valeur de la taille de tas, l’espace initial (ie-Xms) est la mémoire physique de 1/64, l’espace maximum (-Xmx) est la mémoire physique de 1/4. La JVM peut être utilisée pour Xmn-Xms-Xmx et d'autres options peuvent être définies.
La taille de la matrice demandée dépasse la limite VM: cela est dû au fait que l'application de la taille de la matrice dépasse la taille de l'espace de segment de mémoire, par exemple un espace de 256 Mo dans le tableau à appliquer à une taille de 512 Mo