JavaScript代码,可以内嵌在HTML文件中,也可以单独以文件形式存在; CSS:层叠样式表,可以内嵌在HTML文件中,也可以单独以文件形式存在; 图片:各种编码格式的图片; SVG:用于绘制SVG的2D 矢量图形表示; 字体文件:CSS3支持自定义字体; …… 2. 整个加载资源的过程 具体的加载过程可以看之前我写的一篇关于浏览器缓存原理的文章,很详细! 浏览器缓存详细介绍 二、Chromium多进程资源加载 资源的实际加载在各个Webkit移植中有不同的实现。 2. 网络栈的调用过程 首先是URLRequest被上层调用并启动的时候,它会根据URL的scheme来决定需要创建什么类型的请求。 其中test和test2是自定义关键字,Expires和Domain是预定义关键字,表示失效时间和该Cookie对应的域。
每当new一个HashMap出来的时候它的内部结构是下面的样子 从上图中可以看出,HashMap底层就是一个数组结构,数组中的每一项又是一个链表。 看下图,左边两组是数组长度为16(2的4次方),右边两组是数组长度为15。 就算不指定的话,也会以大于且最接近指定值大小的2次幂来初始化的,代码如下(HashMap的构造方法中): 2) 读取: public V get(Object key) { if (key 归纳起来简单地说,HashMap 在底层将 key-value 当成一个整体进行处理,这个整体就是一个 Entry 对象。 HashMap 底层采用一个 Entry[] 数组来保存所有的 key-value 对,当需要存储一个 Entry 对象时,会根据hash算法来决定其在数组中的存储位置,在根据equals方法决定其在该数组位置上的链表中的存储位置
Redis 的底层原理 Redis 底层数据结构 动态字符串SDS Redis 没有直接使用C语言中的字符串,因为C语言字符串存在很多问题: 获取字符串长度需要通过运算 非二进制安全(如果在字符数组中中间有个元素为 具备类型升级机制,可以节省内存空间 3、底层采用二分查找方式来查询 总的来说就是如果数据量不是很大用intset合适,若数据量特别大,则intset效率会低 Dict Redis 是一个键值型(Key-Value dict.ht[0].used 的 2^n(不得小于4) 2、按照新的realeSize 申请内存空间,创建dictht,并赋值给dict.ht[1] 3、设置dict.rehashidx = 0,表示开始 新版的Redis作者引入了一个新的数据结构叫 ListPack(紧凑列表),只是在Stream结构底层使用了,并没有用到常见的数据结构,可能是因为改动太大,并没有修改它。 这个参数是控制首尾不压缩的节点个数: 0:特殊值,代表不压缩 1:标示 QuickList 的首尾各有1个节点不压缩,中间节点压缩 2:标示 QuickList 的首尾各有2个节点不压缩,中间节点压缩
,传入的对象主要是数据类型,这个在编译器的编译阶段(即编译时)就会确定大小,而不是在运行时 sizeof最终得到的结果是该数据类型占用空间的大小 class_getInstanceSize 这个方法在底层 则类的实例对象实际占用的内存大小是8,可以简单的理解为 8 字节对齐 mallocsize:计算对象实际分配内存大小,这个是由系统完成的,可以从上面的打印结果看出,实际分配的和实际占用的内存并不相等,这个可以根据底层 2中的16 字节对齐算法来解释这个问题 结构体内存对齐 接下来我们首先定义两个结构体,分别计算他们的内存大小,来引入今天的主体,内存对齐原理 struct MyStruct1{ char a; [20,21] }MyStruct1; struct MyStruct2{ char a; //[14] double b; //[0,1,2,3,4,5,6,7] int return slot_bytes; } 算法原理: 算法原理:k + 15 >> 4 << 4 ,其中 右移4 + 左移4相当于将后4位抹零,跟 k/16 * 16一样 ,是16字节对齐算法,小于
本文讲述Synchronized关键字的使用和底层原理,我们使用Synchronized主要是为了保护共享资源在多线程修改的时候,会出现相互覆盖的问题,导致数据错乱。 } //用在方法上,对象级别 public synchronized void inc(){ a++; } public void inc2( 二.原理 接下来讲解一下Synchronized的底层原理,jdk1.6之前,Synchronized锁是用操作系统的Mutex Lock来实现的,每次加锁和解锁操作都需要用户态到内核态的切换,切换代价是十分高的 a++; } } } //优化后,只需加锁和解锁一次 public void unNeedlock2(){ synchronized 0;i<100;i++) { a++; } } } 三.总结 我们讲解了synchronized关键字的使用和它的底层实现
MVCC底层原理 假设现在有一个index表,只有一条数据 此时他是有两个隐藏列的,一个是trxid(事务id),一个是roll pointer(回滚指针) 此时新建三个会话,每个会话创建一个事务,我这里创建了 这三个依次进行一次更新操作,因为只有更新操作的时候才会生成事务id 所以要先去操作别的表一下以便生成事务id 我们在进行第三个事务的时候更新了一条数据在数据库底层会帮我们做这样一件事情 创建一条新数据然后将我们的旧数据放到回滚日志里边
JDK1.8 之前 HashMap 底层是 数组和链表 结合在一起使用也就是 链表散列。
Docker底层原理 底层实现 基本架构 命名空间 pid 命名空间 net 命名空间 ipc 命名空间 mnt 命名空间 uts 命名空间 user 命名空间 控制组 联合文件系统 本人菜鸡一枚,这里对 docker底层原理也只是简单的描述了一下,想要深入研究的小伙伴,建议可以看其他文章 ---- 底层实现 Docker 底层的核心技术包括 Linux 上的命名空间(Namespaces)、控制组(Control
2、为什么要用ConcurrentHashMap? 这两个问题,具体可参考上篇 >面试必备:HashMap底层数据结构? jdk1.8算法优化,hash冲突,扩容等问题 关于ConcurrentHashMap实现原理的两个参考回答,自己可以重新组织一下: ConcurrentHashMap采用的是分段式锁,与之对应的就是HashTable 2、JDK1.8: JDK1.7:ReentrantLock+Segment+HashEntry JDK1.8:Synchronized+CAS+Node+红黑树 JDK1.8屏蔽了JDK1.7中的Segment 2、加锁力度的不同,在JDK1.7中加锁的力度是基于Segment的,包含多个HashEntry,而JDK1.8锁的粒度就是HashEntry(首节点),也就是1.8中加锁力度更低了,在粗粒度加锁中 ReentrantLock
就把张三对应的 key, value 放到数组中角标为 2 的位置存储。 的指数次幂,如果不是 2 的指数次幂,会强行转化成 2 的指数次幂,采用向上接近的转换方式,假设初始容量为 14,不是 2 的指数次幂,向上比较接近的是 2 的 4 次方,所以初始容量会转化成 16。 图片图片为什么要保证 capacity 是 2 的次幂呢? 图片图片扩容过程图片会创建一个新的数组,大小为原来的 2 倍,创建完毕后,开始转移数据。 图片图片图片多线程扩容问题两个线程 t1 和 t2,假设 t2 先执行,t2 执行到 Entry<K, V> next = e.next; 发生阻塞,t1 执行结束后,t2 才继续执行,阻塞前。
JS 的底层运行原理 每调用一个函数就会生成一个执行环境(俗称执行上下文),执行上下文环境数量没有限制 每调用一个函数就会生成一个执行环境(俗称执行上下文),执行上下文环境数量没有限制 单线程 同步执行
如果这个位置没有其它元素,将(k1,v1)直接放入一个Node类型的数组中,当元素加到12的时候,底层会进行扩容,扩容为原来的2倍。 如果该位置已经有其它元素(k2,v2),那就调用k1的equals方法和k2进行比较二个元素是否相同,如果结果为true,说明二个元素是一样的,用v1替换v2,如果返回值为false,二个元素不一样,就用链表的形式将
extends V> map) 二、JDK7 中 HashMap 底层原理 HashMap 在 JDK7 或者 JDK8 中采用的基本存储结构都是数组+链表形式。 本节主要是研究 HashMap 在 JDK7 中的底层实现,其基本结构图如下所示: ? 这里简单地阐述一下,我们在使用 HashMap.put(“Key”, “Value”)方法存储数据的时候,底层实际是将 key 和 value 以 Entry的形式存储到哈希表中,哈希表是一个数组,那么它是如何将一个 五、总结 本文着重讲解了 JDK7 中 HashMap 的具体实现原理,相信读者仔细品读以后,对 JDK7 中的 HashMap 的实现会有一个清晰地认识,JDK7 中的 HashMap 的实现原理属于经典实现 ,不管 JDK7 是否已经再被使用,但是其基本原理还是值得学习!
2、比较组件(component diff) React对于组件的策略有两种方式,分别是类型相同和类型不同的组件 相同的直接继续比较组件内部的dom,不同的类型的会直接替换掉组件内部所有节点(可能虚拟DOM 要明白JSX的原理,需要先明白如何用 JavaScript 对象来表现一个 DOM 元素的结构 1
下面将详细介绍 ZooKeeper 的底层原理,包括其架构、数据模型、核心机制和一致性协议等方面。1. 2. 数据模型ZooKeeper 以类似文件系统的树形结构存储数据,每个节点称为 znode。znode:数据节点,具有路径、数据和状态信息。 理解 ZooKeeper 的底层原理和实现,有助于更好地应用它来解决分布式系统中的一致性问题。我正在参与2024腾讯技术创作特训营最新征文,快来和我瓜分大奖!
对象加锁实现原理 在Java的设计中,每一个Java对象就带了一把看不见的锁,可以叫做内部锁或者Monitor锁,Synchronized在JVM里的实现是基于进入和退出Monitor对象来实现方法同步和代码块同步的 JDK6以前 Synchronized加锁是通过对象内部的监视器锁来实现的,监视器锁本质又是依赖于底层的操作系统的Mutex Lock来实现的,操作系统实现线程之间的切换这就需要从用户态转换到核心态,这个成本非常高
上篇介绍了Spring IOC的核心功能,都在refresh()方法里。那么这个方法是从哪发起调用的呢?
函数重载(C++) 因为是偏向底层的讲解,所以这里不适用VS(IDE),而是使用Linux来展现整个过程。 首先我们回顾一下学习C语言的过程中,可执行文件的生成过程? 2. C语言中的处理 创建三个文件: 我们再在Linux下看看C语言是如何处理函数名的 可以看出,C语言对于函数的描述只有函数名本身,并没有参数的相关信息。
上次我们讲到了主键的索引,我们可以执行一下sql语句 explain select * from t_user where a = 1 我们可以看到这条sql走的是主键的索引,而在mysql的InnoDB中,主键索引则是聚集索引,数据的物理顺序与键值的逻辑(索引)顺序相同,其实就是说主键索引跟其他列的数据是存在一起的。
MySQL索引底层原理 局部性与页 在操作系统中,我们执行一个指令去磁盘取数据,那么他会从磁盘取出4KB数据,这个4KB就是一个局部单位,而这4KB数据就是你的指令中取出的数据周围的数据,因为操作系统认为你下一次的数据会从这条数据的周围中取 那么在Mysql的操作当中,也有这么一个原理。 ? 页数据原理 ? 因为这是一个链表的数据结构,我们都知道链表的数据结构是增删快,查找慢,那么MySQL的InnoDB的存储引擎是怎么解决的呢,在这里引入了一个页目录 页目录在这里重新为主键排了一次序,比如一组的数据是2条 ,那么主键为1跟主键为2就为一组 ?