我正在将游戏移植到Android(有很多代码,而且很少是我的代码),DalvikVM告诉我(通过LogCat)关于垃圾收集的所有内容。在代码中的某个时刻,我得到了一个“GC释放x对象/ x ms”消息流,基本上告诉我~15万个对象刚被删除,并且需要一整秒。
我想知道这些来自哪里!我很确定我并没有故意创造那么多物品。
那么,有没有办法获得...基本上与该消息相反?在创建任何对象时打印日志消息的东西?
这样我就可以跨过代码,检查生成了多少消息,并查看代码的哪些部分正在生成对象。我怀疑在循环的一部分中创建了某种形式的对象,但是如果可能的话,这将是一种简单的方法来确定。
有什么想法吗?
答案 0 :(得分:0)
试试这个,它会帮助你,
Allocation Instrumenter是使用java.lang.instrument API和ASM编写的Java代理。 Java程序中的每个分配都经过检测;每次分配都会调用用户定义的回调。
为了编写自己的分配跟踪代码,您必须实现Sampler接口并将其实例传递给AllocationRecorder.addSampler():
AllocationRecorder.addSampler(new Sampler() {
public void sampleAllocation(int count, String desc,
Object newObj, long size) {
System.out.println("I just allocated the object " + newObj +
" of type " + desc + " whose size is " + size);
if (count != -1) { System.out.println("It's an array of size " + count); }
}
});
您还可以使用分配指示器来检测特定类的构造函数。您可以通过实例化ConstructorCallback并将其传递给ConstructorInstrumenter.instrumentClass()
来实现此目的。try {
ConstructorInstrumenter.instrumentClass(
Thread.class, new ConstructorCallback<Thread>() {
@Override public void sample(Thread t) {
System.out.println("Instantiating a thread");
}
});
} catch (UnmodifiableClassException e) {
System.out.println("Class cannot be modified");
}
项目源代码可在此处获取
https://code.google.com/p/java-allocation-instrumenter/
在android中通过上面给出的解决方案,这也可以使用具有分配跟踪器的ddms工具 随Android一起提供。您可以开始跟踪所有对象的分配以及分配位置的堆栈跟踪。但是,此工具可以生成一个信息,您想要的特定信息并不总是易于解析或查找。如果您有Sun JVM的版本,我建议使用Kai提到的工具,它们更加发达。如果您必须在Android中执行此操作,则使用分配跟踪器将为您提供一个开始。