- 博客(23)
- 收藏
- 关注
原创 源码解读:Golang内存分配
大对象可能会占据整一个span,如果大对象频繁申请的话会导致mcache和mcentral缓存频繁耗尽,为了避免mcache和mcentral的频繁刷新,大对象直接从mheap中申请整个span,该span的class为0。同时,如果申请80kb的实例,需要分配10次page,将会造成重复调用,降低性能。普通的span分配,span被划分成等大的区域,每个区域正好可以容纳一个对象,这种情况可能导致内存碎片,例如每个区域的大小是8字节,如果我要为5字节大的对象申请,会有3字节的内存碎片。
2026-02-11 10:00:00
1538
原创 Linux网络IO模型
应用层调用write或者send函数,将数据封装成msg,然后传递到内核态进入内核态的传输层,将msg拷贝到内核态封装成skb,放入TCP队列中等待发送并进行流量控制和拥塞控制,并且封装TCP头。拷贝一份数据传递给网络层接着传递到网络层,根据目的ip查询路由表获取源ip,封装ip头,进行过滤和mtu切片(这个过程要拷贝)接着到达数据链路层,查询本地缓存或者发起arp请求封装Mac头。
2026-02-27 09:30:00
626
原创 RocketMQ基本概念与原理
Message:消息,就是要传输的数据。Topic:主题,可用看做是消息的归类,例如一个电商系统可用分为交易消息、物流消息等,每个消息必须要要有一个topic。Message Queue:存放消息的队列,一个主题可以有一个或者多个队列。Offset:队列中的存储单元都是定长的,通过Offset访问队列元素。可以认为Message Queue是长度无限的数组,Offset就是下标。
2026-02-02 01:11:09
564
原创 Linux是如何收发网络包的
网卡收到第一个数据包时,触发一次硬中断,驱动处理函数会立即禁用该网卡的硬中断(避免后续数据包持续触发硬中断),接着将网卡加入内核的NAPI 轮询队列,触发软中断,在软中断上下文通过轮询方式,一次性批量读取网卡 RingBuffer 中的所有 skb(而非单个),当轮询处理完 RingBuffer 中的所有 skb,或达到 CPU 的处理配额(如一次最多处理 64 个包),再重新启用网卡的硬中断,等待下一批数据包到来。在发送和接受数据时,两者指向同一个skb,网卡通过DMA控制器访问内存的skb。
2026-01-30 00:09:25
743
1
原创 缓存一致性
策略一致性优点缺点先更新数据库再删缓存不保证一致性实现简单可能导致数据永久不一致,或者不一致时间是数据的过期时间缓存延时双删最终一致性实现相对简单,延时时间不好控制,写操作中间依然存在数据不一致现象禁用回写缓存强一致性保证数据强一致性实现复杂,且延时时间不好控制,禁用回写缓存期间读操作直接读数据库,对数据库压力大监听binlog日志最终一致性逻辑解耦实现成本高,需要引入新组件基于BinLog实现缓存一致性 | 秦穆之。
2026-01-11 02:57:58
687
原创 Go:context
context沿用了CSP通信顺序进程模型的思想,通过共享内存之外的通信方式来协调并发,每个context都不可修改,通过channel通信,实现并发安全。
2026-01-10 02:52:38
466
原创 MySQL分页查询的优化及其原理
在网页开发中和分批转移数据时,无可避免要使用到分页查询的场景,这种场景实际上是使用了MySQL的Limit进行分页,但是Limit使用不当会导致查询速度明显下降。首先,我们先创建一个表用于展示分页查询。
2024-11-06 20:40:29
521
原创 常见定时调度任务的选型
Timer 类用于在后台线程中调度任务的执行。它可以执行一次性任务或定期任务。Timer 属于 java.util 包。Timer 会在一个单独的线程中执行所有的定时任务。这意味着如果一个任务正在执行,其他任务会被排队等待,直到当前任务完成。并且Timer 使用的线程是由 Timer 自身创建的,无法指定或更改。所有的定时任务都是在这个线程中执行的。因此,如果在Timer中要执行多个任务非常容易出现问题。
2024-11-05 20:19:21
546
原创 @PostConstruct与SmartLifecycle与CommandLineRunner
有些场景我们需要在Spring 所有的bean 完成初始化后紧接着执行一些任务或者启动需要的异步服务。常见有几种解决方案。
2024-10-22 20:34:58
1004
原创 五种常见序列化算法:JDK、JSON、Hession、Kryo、ProtoStuff
序列化算法优点缺点JDK使用简单,可靠性能极差,占空间,不跨语言JSON格式简洁、可读性强性能较差,占空间Hession跨平台方便性能较差Kryo性能高,占空间小不跨语言ProtoStuff高性能依赖schema性能对比:Kryo > ProtoStuff > JSON > Hession > JDK空间开销:JKD > Hession > JSON > ProtoStuff > Kroy以上数据来自。
2024-07-30 19:07:30
2234
1
原创 类文件结构
最开始,代码编译的结果只能是二进制本地机器码,而如今越来越多语言选择了与操作系统和机器指令无关的、平台中立的格式作为程序编译后的存储格式。Java选择字节码作为程序存储格式,即”Class文件“。注意:任何一个Class文件都对应着唯一一个类或接口的定义消息,但类或接口不一定必须定义在文件中(类和接口可以动态生成,直接送入类加载器中,例如使用反射机制)。
2024-07-30 14:19:35
954
原创 自动配置原理
参考: https://b23.tv/JFhubZ2自动配置:springBoot自动去把第三方组件的bean装载到ioc容器里面,不需要开发人员再写bean相关的配置。在启动类上加上@SpringBootApplication注解就可以实现自动配置。
2024-07-30 01:08:27
621
原创 Redis主从复制
为了进一步提高Redis的并发能力,我们需要搭建主从集群,实现。主服务器:可以进行读写操作,并将写操作同步给从服务器。从服务器:只能进行读操作,接收主服务器同步的写操作命令,并且执行该操作。
2024-07-26 14:43:54
836
原创 对象中JVM中
在堆中划出一部分作为句柄池,reference存储对象的句柄地址,句柄中包含对象的实例数据地址信息和对象类型数据地址信息。例如线程A给对象A分配内存,指向了一个指针进行分配。选择哪种方法由空间压缩算法决定,例如标记清除(只能用空闲指针)算法,标记复制算法,标记整理算法。好处:具有稳定的句柄地址,reference指向句柄地址不会变,对象被移动只需要改变句柄的指针。可以通过reference直接访问对象实例,访问对象的类的数据的话还是需要指针。好处:开销降低,指向实例数据的话只要一次指向。
2024-07-25 14:03:17
419
原创 字节码的执行引擎
栈帧需要分配的内存只取决于程序源码和虚拟机的内存布局,不受程序运行时的变量影响,因为栈帧所需要多大的局部变量表和操作数栈在编译源码时已经被分析出来了,并写到了方法表的code属性中。方法无论以哪种方式退出,都必须返回最初方法被调用的位置,程序才能继续执行,一般来说,方法正常退出时,主调方法的pc计数器的值是方法返回地址。虚拟机在重载时是根据参数的静态类型而不是实际类型决定的,在调用重载方法时,根据静态类型选择对应参数的重载方法。只有位于栈顶的栈帧才是真正运行的,被称为当前栈帧,该方法被称为当前方法。
2024-07-25 13:59:28
583
原创 类加载机制
类加载机制:jvm把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的java类型。
2024-07-25 13:56:30
883
原创 垃圾收集器与内存分配策略
程序计数器,虚拟机栈,本地方法栈随着线程而生,随着线程死,栈中的栈帧在方法执行后会自动出栈,所以这几部分不需要垃圾回收。而堆和方法区具有不确定性,内存的分配回收都是动态的,需要垃圾回收机制。堆中主要回收对象,方法区主要回收废弃的常量和不再使用的类。
2024-07-25 13:53:22
833
原创 Future 、promise和compleableFuture有什么区别
在异步处理时,我们常常需要用到这些接口:jdk中的Future和CompleableFuture,netty中的Future和promise。其中jdk的Future和CompleableFuture在上篇文章中已经讲过了,现在先来讲讲netty的Future和promise。
2024-07-24 16:44:32
915
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅