Domanda

Sto eseguendo la mia applicazione con un profiler.La "classe" che consuma più memoria è la char[] che è di circa 10 kB nella mia applicazione.

Ho quindi creato un file InputStream (PipedInputStream per l'esattezza) che contiene un array di byte di dati di 300 MB.

Poi ho dato un'occhiata al mio profiler e non vedo alcun cambiamento significativo (non vedo da nessuna parte che qualcosa consumi 300 MB).

La domanda è: se quei 300 MB di array di byte non sono in memoria, dove li tiene Java?

[Aggiornamento]Ulteriori informazioni su come ho ottenuto i 300 MB sul mio PipedInputStream:

Sto sviluppando un'app Web con un meccanismo di caricamento di file.E in uno dei processi di caricamento del file, creo un flusso di input (PipedInputStream).Fondamentalmente,

  1. Ho letto il flusso di input del multipartfile (pochi KB di byte[] alla volta),
  2. Creato un PipedOutputStream
  3. Creato un PipedInputStream (passando il flusso di output creato di recente al costruttore)
  4. Ho scritto il flusso di input del multipart in my PipedOutputStream (in esecuzione su un thread separato;che scarica e chiude il flusso di output prima di uscire dal thread). A questo punto, ho una copia dei byte del multipart nel mio flusso di input
  5. Quindi (accidentalmente) ho memorizzato quel flusso di input nella mia sessione http (la discussione/dibattito sul fatto che sia una buona idea sarebbe su una domanda diversa)

Quindi la domanda è ancora una volta: dove tiene Java il mio file InputStream(non lo vedo da nessuna parte nel mio profiler)?

[Aggiornamento n. 2]

Ho un FileOutputStream che si legge dal PipedInputStream e scrive in un file.

È stato utile?

Soluzione

UN PipedInputStream rende semplicemente disponibili i dati quando vengono scritti dal flusso di output a cui è connesso.Finché continui a leggere dal flusso di input alla stessa velocità con cui riceve i dati dal flusso di output, non ci saranno molti dati da memorizzare nel buffer.

Se ciò non aiuta, dovrai fornire maggiori informazioni su cosa stai facendo con il flusso di input convogliato: a quale flusso di output è connesso e cosa sta leggendo da esso?

MODIFICARE: Non hai ancora detto cosa stai leggendo dal tuo PipedInputStream.Qualcosa deve essere, altrimenti il PipedOutputStream bloccherebbe - PipedInputStream hanno solo un buffer abbastanza piccolo (per impostazione predefinita).

Altri suggerimenti

A PipedInputStream non memorizza alcun dato. Inoltre, da dove prendi quell'array di byte da 300 MB?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top