Pregunta

Estoy ejecutando mi aplicación bajo un generador de perfiles.La 'clase' que tiene el mayor consumo de memoria es la char[] que es de aproximadamente 10 kB en mi aplicación.

Luego creé un InputStream (PipedInputStream para ser exactos) que contiene una matriz de datos de bytes de 300 MB.

Luego eché un vistazo a mi generador de perfiles y no veo ningún cambio significativo (no veo por ningún lado que algo consuma 300 MB).

La pregunta es, si esos 300 MB de matriz de bytes no están en la memoria, ¿dónde los guarda Java?

[Actualizar]Información adicional sobre cómo conseguí los 300 MB en mi PipedInputStream:

Estoy desarrollando una aplicación web que tiene un mecanismo de carga de archivos.Y en uno de los procesos en la carga de mi archivo, creo un flujo de entrada (PipedInputStream).Básicamente,

  1. Leí el flujo de entrada del archivo multiparte (unos pocos KB de byte [] a la vez),
  2. Creo un PipedOutputStream
  3. Creo un PipedInputStream (pasando el flujo de salida creado recientemente al constructor)
  4. Escribí el flujo de entrada del multipart en mi PipedOutputStream (ejecutándose en un hilo separado;que vacía y cierra ese flujo de salida antes de salir del hilo). En este punto, ahora tengo una copia de los bytes de multiparte en mi propio flujo de entrada.
  5. Luego (accidentalmente) almacené ese flujo de entrada en mi sesión http (la discusión/debate sobre si es una buena idea sería sobre una pregunta diferente)

Entonces, la pregunta nuevamente es: ¿dónde guarda Java mi InputStream¿El contenido (no lo veo en ninguna parte de mi perfil)?

[Actualización n.º 2]

tengo un FileOutputStream que se lee desde el PipedInputStream y escribe en un archivo.

¿Fue útil?

Solución

A PipedInputStream solo hace que los datos estén disponibles cuando los escribe la secuencia de salida a la que está conectado. Mientras siga leyendo desde su flujo de entrada tan rápido como reciba datos del flujo de salida, no habrá muchos datos para almacenar en el búfer.

Si eso no ayuda, deberá proporcionar más información sobre lo que está haciendo con la secuencia de entrada canalizada: ¿a qué secuencia de salida está conectada y qué está leyendo?

EDITAR: aún no ha dicho lo que lee de su PipedOutputStream. Algo debe ser, ya que de lo contrario <=> bloquearía - <=> solo tiene un búfer bastante pequeño (por defecto).

Otros consejos

A PipedInputStream no almacena ningún dato en absoluto. Además, ¿de dónde obtiene esa matriz de bytes de 300 MB?

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