2010-03-19 6 views
2

Je reçois une exception java.lang.outOfMemoryError lors de l'écriture d'un gros fichier dans le servletOutputStream. Chaque réponse est par défaut encapsulée à l'aide d'un objet ehcache.constructs.web.filter pour la compression GZIP. Et selon les journaux, l'exception est levée dans l'objet Filtre. Existe-t-il un moyen d'augmenter la mémoire disponible afin que l'exception outOfMemoryError ne se produise pas?Erreur Java OutOfMemory dans le filtre

+1

utilisez-vous tomcat? – Bozho

Répondre

1

Vous devez ajouter l'option "-Xmx1024m" à la commande java qui exécute votre servlet conta iner. (Remplacez 1024m par la taille de segment que vous voulez, ce qui signifie 1024 mégaoctets.) Si vous utilisez, par exemple, Tomcat, cela signifie que vous définissez ceci dans la variable d'environnement CATALINA_OPTS. La configuration de votre serveur variera. Toutefois, le problème est la mise en mémoire tampon d'un tel gros fichier en mémoire. C'est du gaspillage. Essayez ce filtre de compression, qui ne cache pas de cette façon:

http://sourceforge.net/projects/pjl-comp-filter/

+0

Le fichier a une taille de 17 Mo. Cela devrait-il causer un problème? J'utilise un serveur JBOSS. –

+0

Je pourrais imaginer que prendre 50 + MB de tas avec toutes les structures de données intermédiaires. Et, si votre tas est laissé à la valeur par défaut d'environ 64 Mo, oui, c'est un problème. Alors que vous pouvez agrandir le tas, je pense vraiment qu'il vaut mieux utiliser un filtre qui n'a pas à charger le fichier en mémoire. Cela ne devrait pas être nécessaire, et le filtre ci-dessus ne le fait pas de cette façon. –

0

option Utiliser la ligne de commande -Xmx Java comme indiqué ci-dessous

java -Xms256m -Xmx512m com.test.MyMain 

Xms représente extrémité inférieure de l'allocation de mémoire et Xmx représente l'extrémité supérieure de l'allocation de mémoire

0

Définissez les options JVM suivantes à votre conteneur de servlet -Xmx256m -Xms128m (dans Tomcat, il est en catalina.sh/catalina.bat)

0

Ne pas oublier peut-être besoin d'augmenter la taille de votre PermGen:

-XX:PermSize=64m -XX:MaxPermSize=256m 

ne De plus, assurez-vous que vous êtes efficace diffusez sur le fichier. Il peut y avoir une mise en mémoire tampon inutilement importante dans le tube de sortie ou de flux d'entrée.

+0

Il y a environ 24k lignes (assez larges) retournées par la base de données, que j'écris dans le flux de sortie servLet. Par conséquent, il y a une quantité gargantuesque de données stockées dans la mémoire. Connaissez-vous un moyen d'améliorer cela. J'ai besoin que toutes les données récupérées soient envoyées au webClient, en une seule réponse. Par conséquent, je ne pense pas que je peux sortir des bains de données de la base de données. –