根據autocreateDatastoreTxns的設置,我得到一個內存泄漏,其中 爲每個查詢(讀取)創建了以下每個類的一個實例。 即100個查詢創建下面的每個類的100個實例(具有DatastoreServiceConfig的異常,其每個查詢獲得2個實例)的 例外。這是GAE內存泄漏的證據嗎?
我在開發環境中使用Java VisualVM Profiler發現了這個問題。我做這個 的原因是,在生產中,我們的實例堆大小不斷增長(通常在10-20個請求後變得太大,因此最終導致響應緩慢和實例重新啓動)。 我不知道這是否是原因,但這是迄今爲止我已經能夠識別的第一個泄漏。
//泄漏與datanucleus.appengine.autoCreateDatastoreTxns =假
org.datanucleus.store.appengine.jdo.DatastoreJDOPersistenceManager
org.datanucleus.store.appengine.KeyRegistry
org.datanucleus.store.appengine.EmualtedXARResource
org.datanucleus.store.appengine.DatastoreConnectionFactoryImpl$DatastoreManagedConnection
//泄漏與datanucleus.appengine.autoCreateDatastoreTxns =真
com.google.appengine.api.datastore.DatastoreServiceConfig // 2 instances per query
org.datanucleus.store.appengine.jdo.DatastoreJDOPersistenceManager
com.google.appengine.api.datastore.AsyncDatastoreServiceImpl
com.google.appengine.api.datastore.DatastoreServiceImpl
org.datanucleus.store.appengine.jdo. DatastoreJDOTransation
com.google.appengine.api.datastore.DatastoreXARResource
com.google.appengine.api.datastore.DatastoreProperty
com.google.appengine.api.datastore.KeyRegistry
com.google.appengine.api.datastore.DatastoreConnectionFactoryImpl$DatastoreManagedConnection
com.google.appengine.api.datastore.TransactionStackImpl$ThreadLocalTransactionStack$StaticMember
com.google.appengine.api.datastore.TransactionStackImpl
org.datanucleus.store.appengine.RuntimeExceptionWrapperingDatastoreService
這裏是我的代碼:
PersistenceManager pm = PMF.get().getPersistenceManager();
try {
account = pm.detachCopy(pm.getObjectById(Account.class, accountKey));
} catch (javax.jdo.JDOObjectNotFoundException ex) {
account = null;
} finally {
pm.close();
}
任何想法和想法?這是Google AppEngine中真正的內存泄漏,還是僅僅是開發環境的事實,或者是我自己的錯誤?
是的,我擔心生產與開發內存分析會是這樣的情況......是的,我們已經轉移到F2實例,因爲額外的內存幫助實例持續了一段時間,但內存泄漏似乎相當實質,所以它只是一個小的缺口。 – mrated
我會繼續在我們自己的代碼中尋找泄漏,但是您是否有任何關於GAE實例堆增長如此之多的其他體驗的提示?我還沒有發現任何關於它的討論 - 難得的嗎? – mrated