Question

I am running my application under a profiler. The 'class' that has the most memory consumption is the char[] which is about 10 kB in my application.

I then created an InputStream (PipedInputStream to be exact) which holds a byte array data of 300 MB.

Then I took a look at my profiler, and I don't see any significant change ( don't see anywhere that something eats up 300 MB).

The question is, if that 300 MB of byte array is not in memory, where is Java keeping it?

[Update] Additional info on how I got the 300 MB to my PipedInputStream:

I am developing a web app that has a file upload mechanism. And in one of the processes in my file upload, I create an input stream (PipedInputStream). Basically,

  1. I read the multipartfile's input stream (a few KB of byte[] at a time),
  2. Created a PipedOutputStream
  3. Created a PipedInputStream (passing the recently created output stream to the constructor)
  4. Wrote the multipart's input stream to my PipedOutputStream (running on a separated thread; which flushes and closes that output stream before exiting the thread). At this point, I now have a copy of the multipart's bytes in my own input stream
  5. Then (accidentally) stored that input stream in my http session (discussion/debate on whether that is a good idea would be on a different question)

So the question then again is, where is Java keeping my InputStream's content (I don't see it anywhere in my profiler)?

[Update#2]

I have a FileOutputStream which reads from the PipedInputStream and writes to a file.

Was it helpful?

Solution

A PipedInputStream just makes data available when it's written by the output stream that it's connected to. So long as you keep reading from your input stream as fast as it receives data from the output stream, there won't be much data to buffer.

If that doesn't help, you'll need to give more information about what you're doing with the piped input stream - what output stream is it connected to, and what's reading from it?

EDIT: You still haven't said what's reading from your PipedInputStream. Something must be, as otherwise the PipedOutputStream would block - PipedInputStream only have a fairly small buffer (by default).

OTHER TIPS

A PipedInputStream does not store any data at all. Also, where do you get that 300 MB byte array from?

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top