简体   繁体   English

OutOfMemoryError:Java堆空间GoogleAppEngine

[英]OutOfMemoryError: Java heap space GoogleAppEngine

Got an application running on AppEngine. 得到了在AppEngine上运行的应用程序。 Has been running fine for 2 years. 已经运行两年了。 Checked in on it today and I discoverd it was failing. 今天检查了一下,发现它失败了。 I have not touch the code for a long time. 我已经很久没有触摸代码了。

The error I get is this: 我得到的错误是这样的:

java.lang.OutOfMemoryError: Java heap space
at com.google.storage.onestore.v3.OnestoreEntity$Property.<init>(OnestoreEntity.java:2849)
at com.google.storage.onestore.v3.OnestoreEntity$EntityProto.addProperty(OnestoreEntity.java:5755)
at com.google.storage.onestore.v3.OnestoreEntity$EntityProto.merge(OnestoreEntity.java:6232)
at com.google.apphosting.api.DatastorePb$QueryResult.merge(DatastorePb.java:13045)
at com.google.appengine.repackaged.com.google.io.protocol.ProtocolMessage.mergeFrom(ProtocolMessage.java:405)
at com.google.appengine.repackaged.com.google.io.protocol.ProtocolMessage.mergeFrom(ProtocolMessage.java:422)
at com.google.appengine.repackaged.com.google.io.protocol.ProtocolMessage.parseFrom(ProtocolMessage.java:534)
at com.google.appengine.api.datastore.DatastoreApiHelper$1.wrap(DatastoreApiHelper.java:90)
at com.google.appengine.api.datastore.DatastoreApiHelper$1.wrap(DatastoreApiHelper.java:83)
at com.google.appengine.api.utils.FutureWrapper.wrapAndCache(FutureWrapper.java:51)
at com.google.appengine.api.utils.FutureWrapper.get(FutureWrapper.java:67)
at com.google.appengine.api.datastore.FutureHelper.getInternal(FutureHelper.java:71)
at com.google.appengine.api.datastore.FutureHelper.quietGet(FutureHelper.java:32)
at com.google.appengine.api.datastore.QueryResultsSourceImpl.loadMoreEntities(QueryResultsSourceImpl.java:69)
at com.google.appengine.api.datastore.QueryResultsSourceImpl.loadMoreEntities(QueryResultsSourceImpl.java:56)
at com.google.appengine.api.datastore.QueryResultIteratorImpl.ensureLoaded(QueryResultIteratorImpl.java:156)
at com.google.appengine.api.datastore.QueryResultIteratorImpl.hasNext(QueryResultIteratorImpl.java:65)
at org.datanucleus.store.appengine.query.RuntimeExceptionWrappingIterator$1.get(RuntimeExceptionWrappingIterator.java:50)
at org.datanucleus.store.appengine.query.RuntimeExceptionWrappingIterator$1.get(RuntimeExceptionWrappingIterator.java:47)
at org.datanucleus.store.appengine.query.QueryExceptionWrappers$1.get(QueryExceptionWrappers.java:51)
at org.datanucleus.store.appengine.query.QueryExceptionWrappers$2.get(QueryExceptionWrappers.java:86)
at org.datanucleus.store.appengine.query.RuntimeExceptionWrappingIterator.hasNext(RuntimeExceptionWrappingIterator.java:105)
at org.datanucleus.store.appengine.query.LazyResult.resolveAll(LazyResult.java:115)
at org.datanucleus.store.appengine.query.LazyResult.size(LazyResult.java:110)
at org.datanucleus.store.appengine.query.StreamingQueryResult.size(StreamingQueryResult.java:130)
at guestbook.ProxyServlet.processRequest(ProxyServlet.java:132)
at guestbook.ProxyServlet.doGet(ProxyServlet.java:288)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
at com.google.apphosting.utils.servlet.ParseBlobUploadFilter.doFilter(ParseBlobUploadFilter.java:97)

The code at line 132 in my proxy servlet access a list of entities I retrived from the database. 我的代理Servlet中第132行的代码访问了我从数据库中检索到的实体列表。 It's this line "System.out.println("from db "+allEventsLst.size());" 这行是“ System.out.println(“来自数据库“ + allEventsLst.size());”

My application works when I run a local server. 运行本地服务器时,我的应用程序可以工作。 Any ideas??? 有任何想法吗???

    String fromDateStr = shortDf.format(fromDate);



    Query query = pm.newQuery(Event.class, "date >= fromDate");
      query.declareImports("import java.lang.String");
      query.declareParameters("String fromDate");    

    List<Event> allEventsLst = (List<Event>)query.execute(fromDateStr);

    System.out.println("from db "+allEventsLst.size());

    Map<String, Event> eventMap = new HashMap<String, Event>();

    for (Event e : allEventsLst) {

Thanks 谢谢

Not exactly sure but could be that the List is lazy loaded and when you call the size method it has to load all the elements. 不确定,但可能是List是延迟加载的,并且当您调用size方法时,它必须加载所有元素。 As your application has been running for awhile it may have enough elements to cause the out of memory problem. 由于您的应用程序已经运行了一段时间,因此它可能有足够的元素导致内存不足问题。

Check the number of rows that is being returned from your source. 检查从您的源返回的行数。 Odds are, there is significantly more rows than normal and your data source doesn't have cursor'ing enabled, so the driver is trying to load all of the rows into memory and then running out. 奇怪的是,行数比正常多得多,并且您的数据源未启用游标,因此驱动程序正在尝试将所有行加载到内存中然后耗尽。

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

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