本站消息

站长简介/公众号


站长简介:高级软件工程师,曾在阿里云,每日优鲜从事全栈开发工作,利用周末时间开发出本站,欢迎关注我的微信公众号:程序员总部,程序员的家,探索程序员的人生之路!分享IT最新技术,关注行业最新动向,让你永不落伍。了解同行们的工资,生活工作中的酸甜苦辣,谋求程序员的最终出路!

  价值13000svip视频教程,java大神匠心打造,零基础java开发工程师视频教程全套,基础+进阶+项目实战,包含课件和源码

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

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

发布于2022-01-08 22:13     阅读(1009)     评论(0)     点赞(17)     收藏(3)


根据 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 中的真正内存泄漏,还是开发环境的真实情况,或者可能是我自己的错误?


解决方案


开发应用服务器旨在模拟真实应用服务器的语义,以便您可以合理保真地进行开发。这不包括内存行为,特别是关于数据存储。开发服务器倾向于以真正的应用程序服务器没有的方式将内容保存在内存中。分析开发服务器对于解决应用程序端的泄漏仍然很有用,但不会为您提供有关可能在应用程序服务器端的泄漏的太多指导。不过,我们确实要注意那些。随着时间的推移,堆确实会碎片化。

某些应用程序因其使用和数据访问模式的性质而受益于更大的前端实例。那些成本更高,因此您必须根据增加的成本来测试和权衡收益。



所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:http://www.javaheidong.com/blog/article/375945/50e31f29843721413e9f/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

17 0
收藏该文
已收藏

评论内容:(最多支持255个字符)