摘要: 常见的思路 内存泄露 托管内存暴涨大多数原因都是因为对象被GC Root(stack,gchandle,finalizequeue)持有,所以一直无法释放,所以观察的重点都在对象的可疑GC Root 上 CPU高 CPU占用率高是由线程抬起来,因此观察线程当时在做什么,调用堆栈上的方法执行了多久是重 阅读全文
posted @ 2025-02-20 14:51 叫我安不理 阅读(1093) 评论(10) 推荐(10)
摘要: 物理内存与虚拟内存 物理内存(Physical Memory) 定义:物理内存是计算机硬件中的实际RAM(如DDR5内存条),直接通过总线与CPU连接,用于临时存储运行中的程序和数据。 虚拟内存(Virtual Memory) 定义:由操作系统管理的抽象内存层,通过结合物理内存和磁盘空间(如页面文件 阅读全文
posted @ 2025-02-11 17:40 叫我安不理 阅读(1428) 评论(2) 推荐(17)
摘要: 对象分配策略 .NET程序的对象是由CLR控制并分配在托管堆中,如果是你,会如何设计一个内存分配策略呢? 按需分配,要多少分配多少,移动alloc_ptr指针即可,没有任何浪费。缺点是每次都要向OS申请内存,效率低 预留缓冲区,降低了向OS申请内存的频次。但在多线程情况下,alloc_ptr锁竞争会 阅读全文
posted @ 2025-01-06 17:09 叫我安不理 阅读(927) 评论(2) 推荐(11)
摘要: .Net托管堆布局 加载堆 主要是供CLR内部使用,作为承载程序的元数据。 HighFrequencyHeap 存放CLR高频使用的内部数据,比如MethodTable,MethodDesc. 通过is判断类型之间的继承关系,调用接口的方法和虚方法,都需要访问MethodTable LowFrequ 阅读全文
posted @ 2024-12-11 15:20 叫我安不理 阅读(1656) 评论(1) 推荐(23)
摘要: CPU原子操作 原子操作,指一段逻辑要么全部成功,要么全部失败。概念上类似数据库事物(Transaction). CPU能够保证单条汇编的原子性,但不保证多条汇编的原子性 那么在这种情况下,那么CPU如何保证原子性呢?CPU本身也有锁机制,从而实现原子操作 眼见为实 int location = 1 阅读全文
posted @ 2024-12-05 17:45 叫我安不理 阅读(3123) 评论(11) 推荐(26)
摘要: 简介 多线程与异步是两个完全不同的概念,常常有人混淆。 异步 异步适用于"IO密集型"的场景,它可以避免因为线程等待IO形成的线程饥饿,从而造成程序吞吐量的降低。 其本质是:让线程的cpu片不再浪费在等待上,期间可以去干其它的事情。 要注意的是:Async不能加速程序的执行,它只能做到不阻塞线程。 阅读全文
posted @ 2024-11-29 15:10 叫我安不理 阅读(3169) 评论(6) 推荐(20)
摘要: 简介 上文提到,创建线程在操作系统层面有4大无法避免的开销。因此复用线程明显是一个更优的策略,且降低了使用线程的门槛,提高程序员的下限。 .NET Core线程池日新月异,不同版本实现都有差别,在.NET 6之前,ThreadPool底层由C++承载。在之后由C#承载。本文以.NET 8.0.8为蓝 阅读全文
posted @ 2024-11-25 17:00 叫我安不理 阅读(3472) 评论(10) 推荐(38)
摘要: 简介 https://www.cnblogs.com/lmy5215006/p/18494483 在研究.NET String底层结构时,我所观察到的情况与《.NET Core底层入门》,《.NET内存管理宝典》书中描述不符。故多研究了一下。发现.NET托管堆的结构也是越来越多,越来越高性能。 // 阅读全文
posted @ 2024-10-30 16:48 叫我安不理 阅读(2680) 评论(6) 推荐(42)
摘要: 简介 "终结"一般被分为确定性终结(显示清除)与非确定性终结(隐式清除) 确定性终结 提供给开发人员一个显式清理的方法,比如try-finally,using,IDisposable。 非确定性终结 提供一个注册的入口,只知道会执行,但不清楚什么时候执行。比如析构函数。 为什么需要终结机制? 首先纠 阅读全文
posted @ 2024-10-11 15:52 叫我安不理 阅读(2547) 评论(13) 推荐(21)
摘要: 传统哈希局限性 求模,也就是 key % 节点数 N, 当节点数量变化时(如服务器扩容 / 下线),几乎所有数据的映射关系都会失效,导致大量数据需要重新迁移,引发 “哈希雪崩”。 key的hash值 节点数 求模 10 3 10 % 3 = 1 11 3 11 % 3 = 2 12 3 12 % 3 阅读全文
posted @ 2025-08-27 12:28 叫我安不理 阅读(1044) 评论(2) 推荐(9)
摘要: CAP,基础理论 CAP理论是分布式系统中最核心的理论基础 Partition tolerance,分区容错性 the system continues to operate despite arbitrary message loss or failure of part of the syste 阅读全文
posted @ 2025-07-20 12:12 叫我安不理 阅读(3273) 评论(10) 推荐(20)
摘要: 简介 在很多年前的一次Code Review中,有大佬指出,方法的参数太多了,最好不要超过四个,对于当时还是萌新的我,虽然不知道什么原因,但听人劝,吃饱饭,这个习惯也就传递下来了,直到参加工作很多年后,才明白这其中的缘由。 调用协定 在计算机编程中,调用协定(Calling Convention)是 阅读全文
posted @ 2025-06-25 22:36 叫我安不理 阅读(4403) 评论(33) 推荐(91)
摘要: CPU与RAM的隔阂 CPU与RAM是两个独立的硬件,并非集成在一起。所以他们两个之间一定会存在一个连接的桥梁,这个桥梁的名字叫做内存总线。 内存总线由三部分组成: 地址总线(Address Bus) 用于传输内存地址,也就是我们经常看到的0X77F84FAB这种类似的内存地址,一根总线代表一个电信 阅读全文
posted @ 2025-06-07 14:59 叫我安不理 阅读(1852) 评论(10) 推荐(23)
摘要: 服务架构的演变 单体架构=>分布式架构=>SOA架构=>微服务架构=>Service Mesh=>Cloud Native 单体架构/垂直架构 分布式架构 SOA架构 微服务架构 微服务架构的核心 需要注意一点,微服务架构是分布式架构的一种落地,它们之间是接口与实现类的关系。 服务发现 为什么需要服 阅读全文
posted @ 2025-05-25 12:09 叫我安不理 阅读(2033) 评论(2) 推荐(18)
摘要: 简介 Socket(套接字)是计算机网络中的一套编程接口,是网络编程的核心,它将复杂的网络协议封装为简单的API,是应用层(HTTP)与传输层(TCP)之间的桥梁。 应用程序通过调用Socket API,比如connect、send、recv,无需处理IP包封装,路由选择等复杂网络操作,屏蔽底层细节 阅读全文
posted @ 2025-05-22 15:03 叫我安不理 阅读(635) 评论(0) 推荐(4)
摘要: 前情提要 四层网络模型各司其职,消息(SDU)在进入每一层时都会多加一个报头(PCI),这个PCI记录着该SDU的一些关键统计信息。SDU+PCI合并起来就组成一个完整的消息,简称为PDU 链路层:帧(Frame)头部作用 源 MAC 地址 和 目的 MAC 地址,用于在局域网内通信唯一标识设备,实 阅读全文
posted @ 2025-05-20 13:46 叫我安不理 阅读(508) 评论(1) 推荐(3)
摘要: 简介 HttpClient是C#中用于发送/接收HTTP请求的核心类,属于 System.Net.Http 命名空间。它是 .NET 中处理网络通信的现代 API,设计目标是替代早期的 WebClient/WebRequest/WebResponse/HttpWebRequest,支持异步编程、灵活 阅读全文
posted @ 2025-05-14 22:08 叫我安不理 阅读(1300) 评论(11) 推荐(11)
摘要: HTTP协议 HTTP(超文本传输协议),属于应用层协议。基于TCP连接实现。但通信方向始终由客户端发起(HTTP/2之后已修改)。 维度 TCP/IP协议族(传输层/TCP) HTTP协议(应用层) 通信方向 全双工(双向同时通信) 单向(客户端→服务器请求,服务器响应) 协议层次 传输层(负责数 阅读全文
posted @ 2025-05-12 16:39 叫我安不理 阅读(455) 评论(0) 推荐(1)
摘要: 网络层协议 网络层(Network Layer) 的主要功能是实现主机之间的逻辑寻址、路由选择和分组转发,确保数据在不同网络(如局域网、广域网)之间的传输 协议类别 核心协议 路由协议 辅助协议 扩展协议 功能 逻辑寻址、分组转发 路径计算与路由表维护 地址解析、错误控制、组播管理 安全、NAT、Q 阅读全文
posted @ 2025-04-29 14:24 叫我安不理 阅读(583) 评论(1) 推荐(2)