将对象持久保存到GAE数据存储区后内存泄漏

时间:2012-01-12 04:25:02

标签: google-app-engine memory-leaks google-cloud-datastore objectify

你能帮我找一下内存泄漏吗?我来自C ++世界,Java中的内存泄漏对我来说有点奇怪,因为根据我的代码我没有提到临时对象。

我正在使用GAE SDK 1.6.1和Objectify 3.1。

我有以下方法在GAE开发服务器的后端实例中执行(这可能与问题无关)。

private void loadProtoBufdata() throws Exception
{
    ObjectifyDAO dao = new ObjectifyDAO();

    for (long count = 0; count < 100; ++count)
    {
        Visitor visitor = new Visitor();
        visitor.setKey(count + 1);
        dao.ofy().put(visitor);
    }

    dao = null;
}

在ObjectifyDAO的构造函数中,它被初始化为

public ObjectifyDAO()
{
    super(new ObjectifyOpts().setSessionCache(false).setGlobalCache(false));
}

Visitor就像

一样简单
public class Visitor
{
    @Id
    Long key;
    Long ek;
    @Unindexed String ip;
    Date t;
    @Unindexed Long lzVisit;
}

我正在使用JProfiler 7.0.1来捕获内存泄漏。运行此代码后,我有几兆字节的com.google.storage.onestore.v3.OnestoreEntity$PropertyValuecom.google.storage.onestore.v3.OnestoreEntity$Property

我不想炸毁这篇文章所以我上传了JProfiler的截图。

参考树是here。分配树为here

我在Objectify的跟踪器上找到this bug,在Google Ground上为GAE找到this thread。所以我不确定这是谁的错误。

问题是:

1)如何避免内存泄漏? 2)它是否会在生产中发生?

感谢!!!

PS。尼克,我知道你在读这个。请帮助:)

1 个答案:

答案 0 :(得分:2)

查看http://www.eclipse.org/mat/,它非常适合分析内存泄漏

请参阅http://wiki.eclipse.org/index.php/MemoryAnalyzer#Getting_a_Heap_Dump

如果存在内存泄漏,则会引用某些内容。像MAT这样的工具可以帮助你看到那些对象上挂着什么。

另外,您可能想尝试生产测试。您可以在appspot.com实例视图中检查内存使用情况。生产appengine有时可能表现得完全不同。