outofmemoryErrorのアップロードファイルを避ける方法は?

StackOverflow https://stackoverflow.com/questions/3966421

  •  09-10-2019
  •  | 
  •  

質問

画像ファイルをアップロードしようとしています。約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を使用します

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top