2013-01-20 23 views
0

如何避免OutOfMemoryError异常?如何在达到OutOfMemoryError之前启动新的GAE实例

App Engine调度程序基于响应时间启动实例,但是当现有实例超过其内存配额时,我们需要启动新实例。

我们的GAE实例处理不同文件大小的多个并发上传请求。每当一个实例处理太多的并发上传(使用堆空间来复制上传的字节)时,该实例就会使用java.lang.OutOfMemoryError崩溃:Java堆空间。

我们已经看到其他帖子提示使用更多内存的实例类或使用后端。 但是,我们是否必须移动到后端才能避免这种情况?或者有没有一种方法可以鼓励普通的GAE实例调度程序不要向接近内存限制的实例发送新的请求?

回答

1

改为使用blobstore upload handler。上传首先通过blob上传处理程序去除blob数据并将其保存到blobstore,然后调用处理程序(并传递保存的blob密钥和其他请求数据)。

这有两个好处:

  1. 你的前端没有参与处理BLOB数据,所以这不应该产生OOM错误。

  2. 上传可能大于32Mb,否则对所有前端请求都有限制。

+0

不幸的是,我们不能使用blobstore AFIK,因为blob不能被用户认证保护(即它通过链接的默认使用安全性)。 –

+0

Blobstore数据只能通过您的代码访问,您可以使用任何您需要的安全方案。 –

+0

另外,对于每个blob,blobstore都会生成一个非常长的随机密钥,这是无法猜测的。在这方面,它与网络上的任何其他安全机制(即cookies)一样安全。 –

相关问题