美文网首页
方法缓存Cache_t分析

方法缓存Cache_t分析

作者: 爱你因为泰勒 | 来源:发表于2020-08-21 10:08 被阅读0次

缓存Cache_t

struct cache_t { // 16
    struct bucket_t *_buckets; // 8
    mask_t _mask; // 4
    mask_t _occupied; // 4
    ...

bucket_t

struct bucket_t {
#if __arm64__
    MethodCacheIMP _imp;
    cache_key_t _key;
#else
    cache_key_t _key;
    MethodCacheIMP _imp;
#endif
...
}

cache_t 缓存的是 方法 method_t

struct method_t {
    SEL name;
    const char *type;
    MethodListIMP imp;
}

缓存流程

缓存的入口是:cache_fill_nolock函数

cache_fill_nolock函数.png

1、首先我们从缓存的入口开始分析,一进入到cache_fill_nolock函数,先查找现有的缓存中是否有对应的方法,有就返回,没有就继续往下走,其中通过sel创建一个key cache_key_t key = getKey(sel);
2、判断现有的缓存是不是空缓存,
如果条件为true,就去创建一个新的buckets桶子,把_mask = newMask; _occupied = 0;,如下:

cache->reallocate(capacity,capacity ? : INIT_CACHE_SIZE);

通过cache->find(key, receiver) 找到刚创建的 buckets,再将新的方法存放进去bucket->set(key, imp);

在cache->find(key, receiver)函数中,是怎么找到缓存bucket_t的呢?
首先通过cache_hash函数计算出key值对应的index值 begin,然后根据这些索引找到bucket_t,如果遍历完后都没有找到的话,说明查找失败,那就会调用bad_cache方法,如下图:

cache->find函数.png

如果缓存里的存储大小 小于 开辟占用的3/4,不作任何处理仅需往下走;
如果缓存里的存储大小 大于 开辟占用的3/4,就需要进行扩容了。

//开始扩容
cache->expend();
扩容.png

扩容是按照原来的2倍来进行的,扩容后,又和之前一样重新创建一个新的buckets。
接着继续查找这个刚创建的buckets,将方法放进buckets中去。

在重新创建一个新的buckets时,会将原来的方法缓存清空掉。如果不清空内存的话,以后如果方法缓存的多了,对应的查找速度也会有一定的影响,内存平移也是一个麻烦。

屏幕快照 2020-08-20 下午5.41.43.png

相关文章

  • 七、cache_t 分析

    主要内容:cache_t的底层原理:分析cache_t缓存的内家及怎样缓存的。一、分析cache_t主要存储的是什...

  • 方法缓存Cache_t分析

    缓存Cache_t bucket_t cache_t 缓存的是 方法 method_t: 缓存流程 缓存的入口是:...

  • objc_class中的cache_t

    目标 主要分析cache_t流程,对象的属性、方法都会被iOS的缓存机制缓存下来,下次调用会从缓存中查找,缓存的功...

  • 类(三)-- cache_t分析

    类(一)-- 底层探索类(二)-- method归属类(三)-- cache_t分析 cache_t作用 用来缓存...

  • iOS-底层原理07-catch_t

    对象的内存结构 cache_t结构 1.第一次运行一个方法之前,cache_t缓存中的方法为0,之后缓存中的方法的...

  • iOS底层之cache_t探索

    前言 这篇文章主要是分析cache_t流程。通过源码探索下类的cache_t主要缓存了哪些信息,又是怎么缓存的。分...

  • objc_msgSend流程分析

    前言 书接上回cache_t缓存流程分析,我们知道方法的最终insert在_buckets(模拟器)或_maskA...

  • 【iOS重学】方法缓存的详细分析

    写在前面 本文我们主要来分析一下方法缓存cache_t的数据结构是什么样的,苹果是怎么实现方法缓存的。 Class...

  • 底层11:Runtime-method、方法缓存、散列表

    方法缓存:Class内部结构中有个方法缓存(cache_t),用散列表来缓存曾经调用过的方法,可以提高方法的查找速...

  • 探究 cache_t (方法缓存)的本质

    Class 内部中有个方法缓存 cache_t,用散列表来缓存调用过的方法,可以提高访问方法的速度。 一、cach...

网友评论

      本文标题:方法缓存Cache_t分析

      本文链接:https://www.haomeiwen.com/subject/agdejktx.html