根据 autocreateDatastoreTxns 的设置,我得到了内存泄漏,为每个查询(读取)创建了以下每个类的一个实例。即 100 个查询创建以下每个类的 100 个实例(DatastoreServiceConfig 除外,它每个查询获取 2 个实例)。
我在开发环境中使用 Java VisualVM 分析器发现了这一点。我这样做的原因是在生产中,我们的实例堆大小不断增长(通常在 10-2 万个请求后变得太大)最终导致响应缓慢和实例重新启动。我不知道这是否是原因,但这是迄今为止我能够识别的第一个泄漏。
// 泄漏 datanucleus.appengine.autoCreateDatastoreTxns=false
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=true
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 中真正的内存泄漏,还是开发环境的现实,或者可能是我自己的错误?