Где хранится содержимое потокового потока Java? - PullRequest
0 голосов
/ 27 января 2009

Я запускаю свое приложение под профилировщиком. Класс, который потребляет больше всего памяти, - это char[], что в моем приложении составляет около 10 КБ.

Затем я создал InputStream (точнее PipedInputStream), который содержит данные байтового массива размером 300 МБ.

Затем я посмотрел на свой профилировщик, и я не вижу каких-либо существенных изменений (нигде не вижу, чтобы что-то съедало 300 МБ).

Вопрос в том, если эти 300 МБ байтового массива не находятся в памяти, где Java хранит их?

[Update] Дополнительная информация о том, как я получил 300 МБ для моего PipedInputStream:

Я занимаюсь разработкой веб-приложения с механизмом загрузки файлов. И в одном из процессов загрузки файла я создаю поток ввода (PipedInputStream). В основном,

  1. Я прочитал входной поток мультифайла (несколько килобайт байта [] за раз),
  2. Создано PipedOutputStream
  3. Создано PipedInputStream (передача недавно созданного выходного потока в конструктор)
  4. Записал входной поток из нескольких частей в my PipedOutputStream (работающий в отдельном потоке; он очищает и закрывает этот выходной поток перед выходом из потока). На данный момент у меня есть копия байтов составной части в моем собственном входном потоке
  5. Затем (случайно) сохранил этот входной поток в моем сеансе http (обсуждение / дискуссия о том, будет ли это хорошей идеей, будет по другому вопросу)

Итак, вопрос снова в том, где Java хранит содержимое моего InputStream (я его не вижу в профайлере)?

[Update # 2]

У меня есть FileOutputStream, который читает из PipedInputStream и записывает в файл.

Ответы [ 2 ]

2 голосов
/ 27 января 2009

A PipedInputStream просто делает данные доступными, когда они записываются выходным потоком, к которому они подключены. Пока вы продолжаете читать из входного потока так же быстро, как он получает данные из выходного потока, данных для буферизации будет не много.

Если это не поможет, вам нужно предоставить больше информации о том, что вы делаете с потоковым входным потоком - к какому выходному потоку он подключен и что из него читает?

РЕДАКТИРОВАТЬ: Вы все еще не сказали, что читает из вашего PipedInputStream. Что-то должно быть, так как иначе PipedOutputStream будет блокировать - PipedInputStream имеет только довольно маленький буфер (по умолчанию).

0 голосов
/ 27 января 2009

A PipedInputStream не хранит никаких данных вообще. Кроме того, откуда вы берете этот байтовый массив размером 300 МБ?

...