2010-04-18 52 views
4

我在我的java appengine應用程序中有幾個servlet在內存中進行排序,並且需要幾秒的時間才能完成。這些完全沒有錯誤。Java Appengine APPSTATS導致java內存不足錯誤

不過,我最近啓用的AppEngine將Appstats並開始收到以下錯誤:

java.lang.OutOfMemoryError: Java heap space 
    at java.util.Arrays.copyOf(Unknown Source) 
    at java.lang.AbstractStringBuilder.expandCapacity(Unknown Source) 
    at java.lang.AbstractStringBuilder.append(Unknown Source) 
    at java.lang.StringBuilder.append(Unknown Source) 
    at java.lang.StringBuilder.append(Unknown Source) 
    at java.lang.StringBuilder.append(Unknown Source) 
    at com.google.appengine.repackaged.com.google.protobuf.TextFormat$TextGenerator.write(TextFormat.java:344) 
    at com.google.appengine.repackaged.com.google.protobuf.TextFormat$TextGenerator.print(TextFormat.java:332) 
    at com.google.appengine.repackaged.com.google.protobuf.TextFormat.printUnknownFields(TextFormat.java:249) 
    at com.google.appengine.repackaged.com.google.protobuf.TextFormat.print(TextFormat.java:47) 
    at com.google.appengine.repackaged.com.google.protobuf.TextFormat.printToString(TextFormat.java:73) 
    at com.google.appengine.tools.appstats.Recorder.makeSummary(Recorder.java:157) 
    at com.google.appengine.tools.appstats.Recorder.makeSyncCall(Recorder.java:239) 
    at com.google.apphosting.api.ApiProxy.makeSyncCall(ApiProxy.java:98) 
    at com.google.appengine.api.datastore.DatastoreApiHelper.makeSyncCall(DatastoreApiHelper.java:54) 
    at com.google.appengine.api.datastore.PreparedQueryImpl.runQuery(PreparedQueryImpl.java:127) 
    at com.google.appengine.api.datastore.PreparedQueryImpl.asQueryResultList(PreparedQueryImpl.java:81) 
    at org.datanucleus.store.appengine.query.DatastoreQuery.fulfillEntityQuery(DatastoreQuery.java:379) 
    at org.datanucleus.store.appengine.query.DatastoreQuery.executeQuery(DatastoreQuery.java:289) 
    at org.datanucleus.store.appengine.query.DatastoreQuery.performExecute(DatastoreQuery.java:239) 
    at org.datanucleus.store.appengine.query.JDOQLQuery.performExecute(JDOQLQuery.java:89) 
    at org.datanucleus.store.query.Query.executeQuery(Query.java:1489) 
    at org.datanucleus.store.query.Query.executeWithArray(Query.java:1371) 
    at org.datanucleus.jdo.JDOQuery.execute(JDOQuery.java:243) 
    at com.poo.pooserver.dataaccess.DataAccessHelper.getPooStream(DataAccessHelper.java:204) 
    at com.poo.pooserver.GetPooStreamServlet.doPost(GetPooStreamServlet.java:58) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:713) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:806) 
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166) 
    at com.google.appengine.tools.appstats.AppstatsFilter.doFilter(AppstatsFilter.java:92) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
+0

我不知道你想要什麼答案 - 你正在運行內存不足。您可能需要減少內存消耗或禁用appstats。 – 2010-04-19 10:35:11

+0

好 - 只是不明白爲什麼啓用appstats會使用更多的內存。在一個請求中可以使用多少內存? appstats佔用了多少? – aloo 2010-04-19 22:05:20

回答

1

我不知道這是否可以幫助你降低OutOfMemoryError異常的發生: How to reduce the memory usage of Appstats on Google App Engine Java

<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> 
1

將Appstats本身使用的內存,可以一定程度上的可用內存量降低到您的Java應用程序,但幅度應該是輕微。 Appstats本身也可能會耗盡內存(通常在memcache調用期間看到,link text),但對於您的應用程序來說似乎不是這種情況。我會看看你是否可以做任何事情,把工作分解成更小的部分)。