0

OutOfMemoryError 例外を回避するにはどうすればよいですか?

App Engine スケジューラは応答時間に基づいてインスタンスを開始しますが、既存のインスタンスがメモリ クォータを超えている場合は、新しいインスタンスを開始する必要があります。

当社の GAE インスタンスは、さまざまなファイル サイズの複数の同時アップロード リクエストを処理します。インスタンスが同時に処理するアップロード (アップロードされたバイトをコピーするためにヒープ領域を使用する) が多すぎると、インスタンスは java.lang.OutOfMemoryError: Java heap space でクラッシュします。

より多くのメモリを持つインスタンス クラスの使用またはバックエンドの使用を提案する他の投稿を見てきました。しかし、これを避けるためにバックエンドに移行する必要がありますか? または、通常の GAE インスタンス スケジューラがメモリ制限に近いインスタンスに新しいリクエストを送信しないようにする方法はありますか?

4

1 に答える 1

1

代わりにblobstoreアップロードハンドラーを使用してください。アップロードは、最初にblobデータを削除してblobstoreに保存するblobアップロードハンドラーを経由し、次にハンドラーが呼び出されます(保存されたblobキーとその他の要求データが渡されます)。

これには2つの利点があります。

  1. フロントエンドはblobデータの処理に関与していないため、OOMエラーが発生することはありません。

  2. アップロードは32Mbより大きくなる可能性があります。それ以外の場合は、すべてのフロントエンド要求に制限されます。

于 2013-01-20T19:03:18.210 に答える