outofmemoryErrorのアップロードファイルを避ける方法は?
質問
画像ファイルをアップロードしようとしています。約40〜200kbのサイズのファイルをアップロードするときは、すべてが問題ありません。しかし、サイズ459kbのファイルをアップロードしようとすると、時々アップロードされ、時にはoutofmemoryerrorが表示されます。このエラーがスローされるために、ファイルサイズが非常に大きいとは思いません。私は樹脂を使用しています。大きなサイズのファイルのアップロードを防ぐ樹脂設定がある可能性はありますか?コードには、ファイルアップロードに最大サイズを設定していないためです。
誰もがこれを避ける方法を持っています。ユーザーに、最大約10 MBのあらゆるサイズの画像をアップロードしてもらいたいです。
解決
メモリが不足している場合、最初に確認するのは、JVMが割り当てたメモリの量です。樹脂がどのように動作しているか、どのJVMを使用しているか、またはOS /ホストを使用しているとは言いませんが、通常、JVMはデフォルトのヒープサイズとAAの最大ヒープサイズによって管理されます。コマンドラインから、標準のJVMにあります -Xms
と -Xmx
これらの値を支配するパラメーター。 JVMが起動すると、デフォルトのヒープが割り当てられ、最大まで成長することができます。割り当てが最大ヒープを超える場合、ソフト /弱い参照やその他の使い捨てリソースをリリースしようとする可能性がありますが、GCを強制しますが、それでも十分なスペースがない場合は投げます OutOfMemoryException
. 。したがって、値を変更すると、これが発生すると影響があります。
2番目に探すのは、サーバーにメモリを割り当てる方法です。たとえば、サーバーが強力な参照を持つメモリに荷物の山を保持している場合、メモリが不足する可能性があります。 ehcache ものをディスクに移動します。または、何らかの計算エラーのために、サーブレットがKBの代わりにMBを割り当てていた場合。とにかく、入力全体をメモリに読み込もうとしてはいけません。あなたがサーブレットを実装していると仮定すると、供給された ServletRequest
/ HttpServletRequest
Postdataの入力ストリームにアクセスすることができ、チャンク(一度に32kbなど)で読み取り、チャンクの出力バッファーに書き出すことができます。一般的な経験則では、個別のチャンクの入力データを読み取るために、信頼できないデータがあなたに大きなファイルを渡すことでサーバーを破壊できるようにしたくないので、とにかくより良い練習をするでしょう。
他のヒント
outofmemoryerror 特定のアクションに十分なメモリが利用できない場合、JVMによってスローされます(たとえば、オブジェクトのインスタンス化)
このようなエラーを回避するために、JVM(通常512メガの場合は-XMX512M)に応じて特定のオプションを使用して、起動時にJVMのメモリを拡大できます。
あなたの場合、このような小さなアップロードはoutofmemoryErrorを生成しないでください。 メモリアナライザー エラーの原点を識別します。
アプリケーションを起動しようとしている間、ヒープと予約領域の最大と最小サイズを設定します
XMX XMS XSSを使用します