簡體   English   中英

OutOfMemoryError:Java堆空間GoogleAppEngine

[英]OutOfMemoryError: Java heap space GoogleAppEngine

得到了在AppEngine上運行的應用程序。 已經運行兩年了。 今天檢查了一下,發現它失敗了。 我已經很久沒有觸摸代碼了。

我得到的錯誤是這樣的:

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)

我的代理Servlet中第132行的代碼訪問了我從數據庫中檢索到的實體列表。 這行是“ System.out.println(“來自數據庫“ + allEventsLst.size());”

運行本地服務器時,我的應用程序可以工作。 有任何想法嗎???

    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) {

謝謝

不確定,但可能是List是延遲加載的,並且當您調用size方法時,它必須加載所有元素。 由於您的應用程序已經運行了一段時間,因此它可能有足夠的元素導致內存不足問題。

檢查從您的源返回的行數。 奇怪的是,行數比正常多得多,並且您的數據源未啟用游標,因此驅動程序正在嘗試將所有行加載到內存中然后耗盡。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM