新旧架构计算性能差异

前言

这里以 hprof 功能来进行对比,老架构最大的问题是进行转 hprof 文件严重耗时,而新架构引入了新的概念将此性能提升了原来的 10 倍,让原本较大的 Java 堆内存的 coredump -> hprof 花费 1 ~ 2 小时缩减到 6 ~ 12 分钟。

对象计算路径

例如地址为 0x12c00000 的 Java 对象,解析它所有的成员的计算路径,总体计算上需要寻找以下内存。

我们得到地址如 0x12c00000 是不能直接使用的,需要进行转换成对应 Core 文件的偏移地址后才能使用,而计算文件偏移不能简单的加减,在解析器上地址转换过程相对耗时,单次解析对象平均时间如果超过 0.00144 秒,那么在解析 500'0000 个对象的数据量则需要 2 个小时才能完成。

旧架构

采用传统地址转换计算模型,遍历所有的 Load 段,找到对应段在进行计算。

新架构

新的模型则是在加载 Core 文件初始化时,为 Load 段创建了相应的 LoadBlock 的对象,并且删掉部分不可用的段。最主要的是所有指针/对象都继承内存引用 MemoryRef。

虚实绑定

LoadBlock 直接绑定了 1 个虚地址与 3 个实地址,程序只需找到对应的 LoadBlock 即可直接找到 3 个不同的实地址来计算,但不是影响性能的根本,而是基础。

arduino 复制代码
class Block {
public:
    ...
private:
    //  program member
    uint32_t mFlags;
    uint64_t mOffset;
    uint64_t mVaddr;
    uint64_t mPaddr;
    uint64_t mFileSize;
    uint64_t mMemSize;
    uint64_t mAlign;

    // Real memory addr
    uint64_t mOriAddr;
};

class LoadBlock : public Block {
public:
    ...
private:
    uint64_t mVabitsMask;
    uint64_t mPointMask;
    std::unique_ptr<MemoryMap> mMmap;  // 外部文件映射
    std::unique_ptr<MemoryMap> mOverlay;  // 动态覆盖内存
};

内存引用

正因为都继承了 MemoryRef,在大量重复计算的内存,计算量将会骤减,因为内存引用采用传递的方式来计算,也就是上一个地址已经找到对应的 LoadBlock 后,计算下一个地址若是同一个 Load 段,那么无需再次计算,直接传递上一个内存引用即可。

arduino 复制代码
namespace api {
class MemoryRef {
public:
    ...
private:
    uint64_t vaddr;
    LoadBlock* block;
};
} // namespace api

从计算路径可以知道单个对象最大耗时其实是找 DexFile 这类型地址的过程,需要 4000+ 次判断后才能找到,而新架构上设计内存引用后,如:

kotlin 复制代码
class ArtField : public api::MemoryRef {
public:
    ...
private:
    // quick memoryref cache
    DexFile dex_file_cache = 0x0;
};
相关推荐
2501_944424129 小时前
Flutter for OpenHarmony游戏集合App实战之贪吃蛇食物生成
android·开发语言·flutter·游戏·harmonyos
2501_9371454112 小时前
神马影视8.8版2026最新版:核心技术升级与多场景适配解析
android·源码·电视盒子·源代码管理
2501_9444241214 小时前
Flutter for OpenHarmony游戏集合App实战之俄罗斯方块七种形状
android·开发语言·flutter·游戏·harmonyos
不会Android的潘潘15 小时前
受限系统环境下的 WebView 能力演进:车载平台 Web 渲染异常的根因分析与优化实践
android·java·前端·aosp
建军啊15 小时前
java web常见lou洞
android·java·前端
豆奶dudu16 小时前
安卓应用签名生成+微信开放平台安卓应用签名
android·微信开放平台
AC赳赳老秦17 小时前
Dify工作流+DeepSeek:运维自动化闭环(数据采集→报告生成)
android·大数据·运维·数据库·人工智能·golang·deepseek
2501_9444241217 小时前
Flutter for OpenHarmony游戏集合App实战之记忆翻牌配对消除
android·java·开发语言·javascript·windows·flutter·游戏
2501_9445264217 小时前
Flutter for OpenHarmony 万能游戏库App实战 - 设置功能实现
android·javascript·flutter·游戏·harmonyos
冬奇Lab18 小时前
【Kotlin系列11】协程原理与实战(下):Flow与Channel驯服异步数据流
android·开发语言·kotlin