Pregunta

Estoy tratando de cargar archivos de imagen. Cuando la carga de archivos de tamaños de aproximadamente 40 a 200 kb todo está bien. Pero cuando intento cargar un archivo de tamaño de 459kb a veces se pone subido ya veces se muestra OutOfMemoryError. No creo que el tamaño del archivo es muy grande para que este error sea lanzada. Estoy usando resina. ¿Es posible que hay un ajuste de resina que impide la posibilidad de subir archivos de gran tamaño? Debido a que en el código hay en ninguna parte Soy la creación de cualquier tamaño máximo para la carga de archivos.

Cualquiera tiene alguna idea de cómo evitar esto. Quiero a los usuarios subir imágenes de cualquier tamaño de hasta aproximadamente 10 MB.

¿Fue útil?

Solución

Si está ejecutando fuera de la memoria, lo primero que debe verificar es la cantidad de memoria JVM ha asignado. Usted no dice cómo resina está en marcha o que JVM se está utilizando o el sistema operativo / huésped, pero normalmente una JVM se regirá por un tamaño de montón predeterminado y un tamaño máximo de un montón. Desde la línea de comandos estándar de la JVM tiene parámetros -Xms y -Xmx que rigen estos valores. Cuando se inicia la JVM asigna el montón predeterminado y va a permitir que crezca al máximo. Cuando una asignación excede el máximo de almacenamiento dinámico se podría tratar de liberar las referencias débiles / blandos desechables y otros recursos, la fuerza de un GC, pero si todavía no tiene suficiente espacio que va a lanzar una OutOfMemoryException. Por lo tanto, el cambio de los valores puede afectar cuando esto sucede.

La segunda cosa que buscar es cómo se asigna memoria en el servidor. Por ejemplo, si el servidor tiene un montón de cosas en la memoria con referencias fuertes puede ejecutar fuera de la memoria, si así se considere el uso de un lugar referencias débiles o algo así Ehcache para mover cosas a disco. O si el servlet se destinará MB en lugar de KB debido a algún tipo de error de cálculo. No se debe tratar de leer la entrada completa en la memoria de todos modos. Suponiendo que va a implementar un servlet, entonces el ServletRequest suministrados / HttpServletRequest le permite acceder a la corriente de entrada de la POSTDATA y se puede leer en trozos (por ejemplo, 32 KB a la vez) y lo escribe a un búfer de salida en trozos. Como regla general del pulgar de la lectura de datos de entrada en trozos discretos serían mejores prácticas de todos modos ya no desea que los datos no confiables para poder romper su servidor haciendo pasar algún archivo masivo para usted.

Otros consejos

OutOfMemoryError son arrojados por la JVM cuando no hay suficiente memoria disponible para una acción particular (instanciación del objeto, por ejemplo)

Para evitar este tipo de errores, se puede aumentar la memoria disponibles, para la JVM en tiempo de inicio mediante una opción específica en función de la JVM (por lo general -Xmx512m de 512 megas)

En su caso, tan pequeña carga no debe generar ningún OutOfMemoryError y yo recomendaría el uso de una herramienta como Memory Analyzer para identificar el origen del error.

Al tratar de iniciar la aplicación establezca el tamaño máximo y el mínimo de pila y zonas reservadas

usando Xmx Xms Xss

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top