プロファイラーの下でアプリケーションを実行しています。メモリ消費量が最も多い「クラス」は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、ファイルに書き込むを持っています。