Question

Je suis en train de télécharger des fichiers d'image. Lors du téléchargement des fichiers de tailles d'environ 40 à tout 200kb est très bien. Mais lorsque je tente de télécharger un fichier de taille 459KB parfois il se téléchargé et parfois OutOfMemoryError est affiché. Je ne pense pas que la taille du fichier est très important pour cette erreur d'être jeté. J'utilise la résine. Est-il possible il y a un cadre de résine qui empêche le téléchargement de gros fichiers de taille? Parce que dans le code il n'y a nulle part je définition de toute taille maximale pour le téléchargement de fichiers.

Quelqu'un a des idées sur la façon d'éviter cela. Je veux que les utilisateurs de télécharger des images d'une taille allant jusqu'à environ 10 MB.

Était-ce utile?

La solution

Si vous utilisez de mémoire, la première chose à vérifier est la quantité de mémoire de votre machine virtuelle Java a alloué. Vous ne dites pas comment la résine est en cours d'exécution ou qui JVM qu'il utilise ou le système d'exploitation / hôte, mais généralement une machine virtuelle Java sera régie par une taille de segment par défaut et une taille maximale de pile. A partir de la ligne de commande de la machine virtuelle Java standard a des paramètres de -Xms et -Xmx qui régissent ces valeurs. Lorsque la machine virtuelle Java démarre, il attribue le tas par défaut et il permettra de croître au maximum. Lorsqu'une allocation dépasse le maximum tas, il pourrait essayer de libérer toutes les références douces / faibles et d'autres ressources à usage unique, forcer un GC, mais si elle n'a toujours pas assez d'espace, il lancera une OutOfMemoryException. Par conséquent, la modification des valeurs peut affecter lorsque cela se produit.

La deuxième chose à rechercher est de savoir comment vous allouer de la mémoire dans le serveur. Par exemple, si votre serveur possède un tas de choses en mémoire avec des références fortes, vous pouvez manquer de mémoire, le cas échéant envisager d'utiliser une faible références au lieu ou quelque chose comme Ehcache pour déplacer des choses sur le disque. Ou si votre servlet allouaient Mo au lieu de Ko en raison d'une sorte d'erreur de calcul. Vous ne devriez pas essayer de lire l'entrée entière dans la mémoire de toute façon. En supposant que mettent en œuvre un servlet, le ServletRequest fourni / HttpServletRequest permet d'accéder au flux d'entrée de la POSTDATA et on peut le lire dans les morceaux (par exemple 32Ko à la fois) et l'écrire dans une mémoire tampon de sortie en morceaux. En règle générale, des données d'entrée lecture de pouce en morceaux discrets seraient meilleures pratiques de toute façon, puisque vous ne voulez pas des données non fiables pour être en mesure de briser votre serveur en passant un peu volumineux dossier pour vous.

Autres conseils

OutOfMemoryError sont lancées par la machine virtuelle Java lorsqu'ils ne sont pas suffisamment de mémoire est disponible pour une action particulière (le instanciation d'un objet par exemple)

Pour éviter de telles erreurs, vous pouvez augmenter la avaible mémoire pour la machine virtuelle Java au démarrage en utilisant une option spécifique en fonction de votre machine virtuelle Java (généralement -Xmx512m pour 512 megas)

Dans votre cas, si petit téléchargement ne devrait pas générer un OutOfMemoryError et je recommande d'utiliser un outil tel que Memory Analyzer pour identifier l'origine de l'erreur.

Tout en essayant de lancer l'application de définir la taille max et min pour tas et des espaces réservés

à l'aide Xmx Xms Xss

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top