2

你们能帮我找到内存泄漏吗?我来自 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 上传了截图。

参考树在这里。分配树在这里

我在 Objectify 的跟踪器上发现了这个错误,也在Google Ground for GAE 上发现了这个线程。所以我不确定这是谁的错误。

问题是:

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

谢谢!!!

PS。尼克,我知道你正在读这篇文章。请帮忙 :)

4

1 回答 1

2

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

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

如果存在内存泄漏,则某些东西挂在引用上。MAT 之类的工具将帮助您查看挂在这些对象上的内容。

此外,您可能想在生产环境中进行测试。您可以在 appspot.com 实例视图上检查内存使用情况。生产应用程序引擎有时会表现得完全不同。

于 2012-01-12T04:45:00.093 回答