我正在使用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$PropertyValue
和com.google.storage.onestore.v3.OnestoreEntity$Property
。
我不想炸毁这篇文章所以我上传了JProfiler的截图。
我在Objectify的跟踪器上找到this bug,在Google Ground上为GAE找到this thread。所以我不确定这是谁的错误。
问题是:
1)如何避免内存泄漏? 2)它是否会在生产中发生?
感谢!!!
PS。尼克,我知道你在读这个。请帮助:)
答案 0 :(得分:2)
查看http://www.eclipse.org/mat/,它非常适合分析内存泄漏
请参阅http://wiki.eclipse.org/index.php/MemoryAnalyzer#Getting_a_Heap_Dump
如果存在内存泄漏,则会引用某些内容。像MAT这样的工具可以帮助你看到那些对象上挂着什么。
另外,您可能想尝试生产测试。您可以在appspot.com实例视图中检查内存使用情况。生产appengine有时可能表现得完全不同。