java - 这是 GAE 内存泄漏的证据吗?

标签 java google-app-engine memory-leaks jdo visualvm

根据 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 - 这是 GAE 内存泄漏的证据吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12327158/

相关文章:

Java 重新着色 BufferedImage 不适用于较大高度的图像

java - NoSuchFieldError : INCLUDE_ALL 错误

java - 发送电子邮件后如何 toast ?

java - 将 json 响应转换为自定义类时出错

google-app-engine - 在代理后本地运行谷歌应用引擎

c++ - 增加内存使用量而不泄漏?

ios:如何解决此内存泄漏警告

c# - 如何防止 CompileAssemblyFromSource 泄漏内存?

java - 这个 while 循环中的错误是什么?

java - 从 Google App Engine 应用程序中读取目录中的所有文件