【发布时间】:2012-09-01 20:55:14
【问题描述】:
根据 autocreateDatastoreTxns 的设置,我得到了内存泄漏,与 为每个查询创建以下每个类的一个实例(读取)。 即 100 个查询创建以下每个类的 100 个实例(使用 DatastoreServiceConfig 例外,每个查询获取 2 个实例)。
我在开发环境中使用 Java VisualVM 分析器发现了这一点。我这样做的原因 是在生产中,我们的实例堆大小不断增长(通常变得太大 在 10-20,000 个请求之后)最终导致响应缓慢和实例重新启动。 我不知道这是否是原因,但这是迄今为止我能够识别的第一个泄漏。
// 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 中真正的内存泄漏,还是开发环境的实际情况,或者可能是我自己的错误?
【问题讨论】:
标签: java google-app-engine memory-leaks jdo visualvm