繁体   English   中英

当memAache上的putAll时,Google App Engine java OutOfMemoryError

[英]Google App Engine java OutOfMemoryError when putAll on memcache

我在GAE memchace上存储了大约20k个条目的地图。 每个条目大约1Kb。 我收到以下错误。 有限制吗? 根据我的理解1Mb的限制,它是你在memcache中放入的每个实体而不是整批。

java.lang.OutOfMemoryError: Java heap space
at com.google.appengine.repackaged.com.google.protobuf.AbstractMessageLite.toByteArray(AbstractMessageLite.java:34)
at com.google.appengine.api.memcache.MemcacheServiceApiHelper.makeAsyncCall(MemcacheServiceApiHelper.java:104)
at com.google.appengine.api.memcache.AsyncMemcacheServiceImpl.doPutAll(AsyncMemcacheServiceImpl.java:521)
at com.google.appengine.api.memcache.AsyncMemcacheServiceImpl.putAll(AsyncMemcacheServiceImpl.java:564)
at com.google.appengine.api.memcache.MemcacheServiceImpl.putAll(MemcacheServiceImpl.java:112)
[...]

我的代码看起来像:

final HashMap<EntityToStoreKey, EntityToStore> map = new HashMap<EntityToStoreKey, EntityToStore>();
for (EntityToStore entityToStore : entitiesToStore) {
    index.add(entityToStore);
    map.put(EntityToStoreKey.key(entityToStore.getId(), false), entityToStore);
}
entityToStoreCache.putAll(map, portalCacheTimeout);

而这个问题只发生在prod环境中,而不是本地环境中。

任何帮助/提示?

memcache的大小是GAE中的一个黑盒子。 不要相信它是什么。 你是对的,没有一个实体可以大于1 MB,但你没有IDEA你的总memcache有多大,你也不知道驱逐政策是什么。

最新版本的GAE似乎让我们对memcache有了一些了解,但到目前为止,它确实是一个黑盒子。 我建议不要做你想做的事。 如果您需要加热缓存,请在循环中执行此操作并仅加载最相关的内容。

你在使用Appstats吗? 我发现Appstats使用了大量内存,请在此处查看我的问题: 如何在Google App Engine Java上减少Appstats的内存使用量

当我尝试一次加载大约20,000个条目时,我遇到过OutOfMemoryError,与你的大小相似。 现在我分批加载它们,当时是1000。 以下是使用Siena的示例代码(但应该很容易移植到其他ORM): http ://groups.google.com/group/siena-discuss/msg/cd874589ef7aaa66

我觉得使用方法List.subList()后跟List.remove()或List.clear()很方便

[更新]

我找到了一个未记录的参数来限制StackTrace的大小:

<filter>
  <filter-name>appstats</filter-name>
    <filter-class>com.google.appengine.tools.appstats.AppstatsFilter</filter-class>
    <init-param>
      <param-name>maxLinesOfStackTrace</param-name>
      <param-value>16</param-value>
    </init-param>
</filter>

你得到一个例外,因为你的Java servlet容器内存不足,而不是因为与memcache有关。

如果你试图在一个请求中设置20,000个memcache密钥,我怀疑你做错了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM