プロファイラーの下でアプリケーションを実行しています。メモリ消費量が最も多い「クラス」はchar[]
、私のアプリケーションでは約10kBです。
次に、300 MBのバイト配列データを保持するInputStream
(正確には)を作成しました。PipedInputStream
次に、プロファイラーを調べましたが、大きな変化は見られません(300 MBを消費するものはどこにも見当たりません)。
問題は、その300 MBのバイト配列がメモリにない場合、Javaはそれをどこに保持するのかということです。
[更新]
300MBを取得した方法に関する追加情報PipedInputStream
:
ファイルアップロードメカニズムを備えたWebアプリを開発しています。そして、ファイルアップロードのプロセスの1つで、入力ストリーム(PipedInputStream
)を作成します。基本的に、
- マルチパートファイルの入力ストリーム(一度に数KBのbyte [])を読み取り、
- 作成しました
PipedOutputStream
- 作成
PipedInputStream
(最近作成された出力ストリームをコンストラクターに渡す) - マルチパートの入力ストリームをmyに
PipedOutputStream
書き込みました(別のスレッドで実行されます。スレッドを終了する前に、その出力ストリームをフラッシュして閉じます)。この時点で、自分の入力ストリームにマルチパートのバイトのコピーがあります。 - 次に、(偶然に)その入力ストリームを私のhttpセッションに保存しました(それが良いアイデアであるかどうかについての議論/討論は別の質問になります)
では、問題は、Javaが私InputStream
のコンテンツをどこに保持しているのかということです(プロファイラーのどこにも表示されません)。
[更新#2]
FileOutputStream
から読み取りPipedInputStream
、ファイルに書き込むを持っています。