0

プロファイラーの下でアプリケーションを実行しています。メモリ消費量が最も多い「クラス」はchar[]、私のアプリケーションでは約10kBです。

次に、300 MBのバイト配列データを保持するInputStream(正確には)を作成しました。PipedInputStream

次に、プロファイラーを調べましたが、大きな変化は見られません(300 MBを消費するものはどこにも見当たりません)。

問題は、その300 MBのバイト配列がメモリにない場合、Javaはそれをどこに保持するのかということです。

[更新] 300MBを取得した方法に関する追加情報PipedInputStream

ファイルアップロードメカニズムを備えたWebアプリを開発しています。そして、ファイルアップロードのプロセスの1つで、入力ストリーム(PipedInputStream)を作成します。基本的に、

  1. マルチパートファイルの入力ストリーム(一度に数KBのbyte [])を読み取り、
  2. 作成しましたPipedOutputStream
  3. 作成PipedInputStream(最近作成された出力ストリームをコンストラクターに渡す)
  4. マルチパートの入力ストリームをmyにPipedOutputStream書き込みました(別のスレッドで実行されます。スレッドを終了する前に、その出力ストリームをフラッシュして閉じます)。この時点で、自分の入力ストリームにマルチパートのバイトのコピーがあります。
  5. 次に、(偶然に)その入力ストリームを私のhttpセッションに保存しました(それが良いアイデアであるかどうかについての議論/討論は別の質問になります)

では、問題は、Javaが私InputStreamのコンテンツをどこに保持しているのかということです(プロファイラーのどこにも表示されません)。

[更新#2]

FileOutputStreamから読み取りPipedInputStream、ファイルに書き込むを持っています。

4

2 に答える 2

2

APipedInputStreamは、接続されている出力ストリームによって書き込まれたときにデータを利用できるようにします。入力ストリームから出力ストリームからデータを受信するのと同じ速さで読み取りを続ける限り、バッファリングするデータはそれほど多くありません。

それでも問題が解決しない場合は、パイプされた入力ストリームで何をしているのか、どの出力ストリームに接続されているのか、何を読み取っているのかについて、より多くの情報を提供する必要があります。

編集:あなたはまだあなたから何を読んでいるのかを言っていませんPipedInputStream。何かが必要です。そうでない場合PipedOutputStreamはブロックされます-PipedInputStreamかなり小さなバッファしかありません(デフォルト)。

于 2009-01-27T11:35:03.120 に答える
0

APipedInputStreamはデータをまったく保存しません。また、その300 MBバイトアレイはどこから入手しますか?

于 2009-01-27T11:35:16.097 に答える