【问题标题】:Tracking Object Creation in Android在 Android 中跟踪对象创建
【发布时间】:2014-07-29 09:16:48
【问题描述】:

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

我想知道这些是从哪里来的!我很确定我不是故意创建那么多对象。

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

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

有什么想法吗?

【问题讨论】:

    标签: android ddms


    【解决方案1】:

    试试这个,对你有帮助,

    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 工具 安卓系统自带的。您可以开始跟踪所有对象的分配以及它们分配位置的堆栈跟踪。但是,此工具可以生成大量信息,而您想要的特定信息并不总是易于解析或查找。如果你有 Sun JVM 的版本,我会推荐使用 Kai 提到的工具,它们更发达。如果您必须在 Android 中执行此操作,使用分配跟踪器将为您提供一个开始。

    【讨论】:

      猜你喜欢
      • 2010-10-23
      • 1970-01-01
      • 1970-01-01
      • 2014-01-09
      • 1970-01-01
      • 2021-01-03
      • 1970-01-01
      • 2013-06-10
      • 1970-01-01
      相关资源
      最近更新 更多