Android ART&Dalvik虚拟机 追踪对象分配

本文介绍了Dalvik虚拟机中的AllocationTracker如何追踪内存分配,包括开启追踪、生成记录和打印信息。在ART虚拟机中,类似的功能可以通过SetAllocTrackingEnabled、DumpRecentAllocations和GetRecentAllocations方法实现,且ART可以直接将数据输出到文件,便于分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

本文介绍Dalvik虚拟机中的AllocationTracker,用于追踪dalvik内存分配,能直观的看到分配了什么对象,和分配对象的堆栈。

Dalvik虚拟机

dalvik在dalvik/vm/AllocTracker.cpp中记录了内存分配、堆栈等;

  • dvmAllocTrackerStartup在虚拟机启动时即调用了,可以通过hook调用依次如下三个方法即可,
  • 调用dvmDumpTrackedAllocations时会将存储下来的信息打印在logcat中。
// 开启追踪
bool dvmEnableAllocTracker()
// 生成记录
bool dvmGenerateTrackedAllocationReport(u1** pData, size_t* pDataLen)
// dump出来,打印到logcat里
void dvmDumpTrackedAllocations(bool enable)


/*
 * Record the details of an allocation.
 */
// 从如下结构体就能看出来dalvik记录了些什么。他记录了分配了什么类型的对象、分配了多大、线程id、和分配时的堆栈。 
struct AllocRecord {
    ClassObject*    clazz;      /* class allocated in this block */
    u4              size;       /* total size requested */
    u2              threadId;   /* simple thread ID; could be recycled */

    /* stack trace elements; unused entries have method==NULL */
    struct {
        const Method* method;   /* which method we're executing in */
        int         pc;         /* current execution offset, in 16-bit units */
    } stackElem[kMaxAllocRecordStackDepth];
};

ART虚拟机

art/runtime/debugger.h,可以通过hook调用依次如下三个方法即可。

  • 在虚拟机启动时调用SetAllocTrackingEnabled方法开启追踪;
  • GetRecentAllocations返回追踪的数据,类型是array,可以存储到文件里。这点比dalvik好一点,dalvik是输出到logcat里,还需要写脚本分析logcat;art可以直接输出到文件里,捞取出来后方便分析。
  /*
   * Allocation tracking support.
   */
  static void SetAllocTrackingEnabled(bool enabled) REQUIRES(!Locks::alloc_tracker_lock_);
  static void DumpRecentAllocations() REQUIRES(!Locks::alloc_tracker_lock_);
  static jbyteArray GetRecentAllocations()
      REQUIRES(!Locks::alloc_tracker_lock_) SHARED_REQUIRES(Locks::mutator_lock_);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

baiiu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值