在Android中跟踪对象创建

时间:2014-07-29 09:16:48

标签: android ddms

我正在将游戏移植到Android(有很多代码,而且很少是我的代码),DalvikVM告诉我(通过LogCat)关于垃圾收集的所有内容。在代码中的某个时刻,我得到了一个“GC释放x对象/ x ms”消息流,基本上告诉我~15万个对象刚被删除,并且需要一整秒。

我想知道这些来自哪里!我很确定我并没有故意创造那么多物品。

那么,有没有办法获得...基本上与该消息相反?在创建任何对象时打印日志消息的东西?

这样我就可以跨过代码,检查生成了多少消息,并查看代码的哪些部分正在生成对象。我怀疑在循环的一部分中创建了某种形式的对象,但是如果可能的话,这将是一种简单的方法来确定。

有什么想法吗?

1 个答案:

答案 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中执行此操作,则使用分配跟踪器将为您提供一个开始。