- 博客(73)
- 收藏
- 关注
原创 G1垃圾回收器介绍
概念:G1将整个Java堆内存划分为多个大小相等的区域(Region),每个区域的大小可以在1MB到32MB之间,具体大小由JVM根据堆内存的大小动态决定。 作用:分区的主要目的是为了更好地控制垃圾回收的范围和频率。与传统的垃圾回收器(如CMS)不同,G1不是对整个堆进行垃圾回收,而是对这些分区进行回收。这样可以更灵活地管理内存,减少垃圾回收的停顿时间。 示例:如果Java堆内存是4GB,G1可能会将其划分为2048个2MB的区域。在垃圾回收时,可以选择只回收那些垃圾最多的区域,而不是整个堆。
2025-04-11 14:59:11
601
原创 K8S核心技术点
Service:提供服务发现和负载均衡,为 Pod 提供稳定的网络端点,ClusterIP,NodePort,LoadBalance以及ExternalName。功能:根据节点的资源使用情况、Pod 的资源需求和策略规则,选择最佳节点来运行 Pod。Deployment:管理Pod的副本,确保应用的高可用性,并支持滚动更新和回滚。功能:确保集群的实际状态与期望状态一致,例如管理 Pod 的创建、删除和健康检查。作用:运行在每个节点上的代理,负责管理节点上的容器。作用:负责运行容器的底层软件。
2025-04-08 14:45:53
520
1
原创 docker的几种网络模式
**工作原理**:Docker在宿主机上创建一个虚拟的桥接网络,每个容器在启动时会从这个桥接网络中分配一个IP地址。- **工作原理**:用户可以创建自定义的网络,例如使用 `docker network create` 命令创建自定义的bridge或overlay网络。- **工作原理**:容器直接使用宿主机的网络栈,没有网络隔离。- **适用场景**:适用于不需要网络通信的容器,例如运行本地计算任务的容器。- **默认网络模式**:Docker的默认网络模式是Bridge模式。
2025-04-07 09:34:01
478
原创 设计模式总结
工厂方法模式:适合需要灵活扩展的场景,符合开闭原则,但可能导致类的膨胀。抽象工厂模式:适合需要创建产品族的场景,便于维护和扩展,但实现复杂。简单工厂模式:适合简单的场景,代码结构简单,但扩展性差。
2025-04-02 14:59:06
307
原创 骑士特权基础架构建设
项目背景 重构做了很多,大部分情况是推翻重来,成本相当高,对于大部分小公司来说是不值得这样做的;在业务层面通过微改造,比如读写分离,拆服务和拆缓存等就可以满足当前的业务增长需求;老项目采用springcloud开源框架实现服务的治理,在项目启动阶段,为了快速上线,我们倾向使用开源框架搭建系统,快速满足业务需求;这种框架,对于绝大部分程序员来说只会用,一旦出了问题是非常被动的;随着业务的发展,量级上到一个档次之后,我们需要考虑系统的可维护性,信息安全和稳定性;在某种程度上需要升级底层架构确保服...
2021-07-27 16:56:58
2051
1
原创 常见的几种IO模型介绍
概览从底层到上层来看,IO主要分为两个阶段,第一个阶段为数据准备(等待)阶段,第二个阶段为数据拷贝阶段;第一阶段,从网卡上接收数据,第二个阶段将数据从kernel拷贝到用户态缓存;IO模型阻塞模型:应用程序调用系统调用,比如recvfrom,一直等到第一阶段和第二阶段都ok了才返回; 非阻塞模型:应用程序调用系统调用,比如recvfrom,非阻塞的,第一阶段没准备好,返回errorno=EWOULDBLOCK; 信号驱动模型:应用程序调用系统调用sigaction,注册SIGIO信号,当第一阶段
2021-05-10 13:56:38
251
原创 操作系统零拷贝详解
概念在没有cpu干预的情况下,执行的一个存储区向另外一个存储区拷贝任务;可以减少总线周期和内存带宽;普通I/O实现(4次用户态到内核态切换+4次拷贝) 应用程序调用系统调用read,进行第一次用户态到内核态上线文切换; 将磁盘文件加载到kernel buffer,进行第一次拷贝; 将kernel buffer的数据拷贝到用户态的user buffer中,进行第二次拷贝; read系统调用返回,进行第二次用户态到内核态上线文切换; 用户态应用程序调用write系统调用,进行第三次用户态
2021-05-07 10:17:02
280
原创 行文本文件实时分析器,流量统计数据采集
介绍因项目需要,最近采用inotify和IO多路复用技术,实现了一个轻量级的实时行文本文件内容提取的程序,主要目的是用来监控网关nginx的Access Log,并且对Access Log在本地进行实时解析,字段提取和上报的功能。该程序占用内存较小,在10k左右,最多占用1个核的资源,提供采样上报,全量/增量分析文本以及特定字段内容过滤等功能。该程序可以通过自定义connector插件将本地提取...
2019-12-04 21:24:34
435
原创 花生日记基础架构建设
简要介绍在工程中,我们采用protobuf V3和SpringBoot搭建服务化体系,我们需要一个基于protobuf协议的辅助工具提升效率。我们提供服务级别和方法级别的文档注解,在工程编译期间产生文档数据,利用这些文档数据生成在线文档和接口测试界面,同时提供在线协议编辑器,编译工具,打包和上传SDK到repository等,同时将中台自动化测试用例挂在daily loadbuild的task中...
2019-10-09 13:47:45
761
原创 分布式本地缓存的一种实现
源代码 JavaSDK:https://github.com/gilbertwang1981/string_local_cache.gitC++ Agent:https://github.com/gilbertwang1981/binary_log_agent.gitC++公共库:https://github.com/gilbertwang1981/commonlib4...
2017-08-11 22:18:57
6688
1
原创 分析linux共享内存的实现
Linux对共享内存的实现,在2.6采用了内存映射技术。对于内存共享,主要集中在三个内核函数,他们是do_shmat,sys_shmat和sys_shmdt。其中,sys_shmat调用了do_shmat最终实现了共享内存的attach。sys_shmdt实现了共享内存的detach和destroy。下面我主要对这三个函数的源码进行分析。在分析之前,首先介绍共享内存实现原理。 原理:
2009-07-04 21:03:00
16199
原创 linux 2.6 互斥锁的实现-源码分析
看了看linux 2.6 kernel的源码,下面结合代码来分析一下在X86体系结构下,互斥锁的实现原理。代码分析1. 首先介绍一下互斥锁所使用的数据结构:struct mutex { 引用计数器 1: 所可以利用。 小于等于0:该锁已被获取,需要等待 atomic_t count; 自旋锁类型,保证多cpu下,对等待队列访问是安全的。 spinlock_t wait_lock;
2009-07-02 21:51:00
11105
原创 GCC如何支持函数别名
通过使用以下关键字和语法,可以为函数申明别名。int __sctp_connectx(int fd, struct sockaddr *addrs, int addrcnt){ socklen_t addrs_size = __connectx_addrsize(addrs, addrcnt); if (addrs_size return addrs_size; return se
2009-04-23 16:28:00
1673
原创 Linux AIO机制
Linux的I/O机制经历了一下几个阶段的演进:1. 同步阻塞I/O: 用户进程进行I/O操作,一直阻塞到I/O操作完成为止。2. 同步非阻塞I/O: 用户程序可以通过设置文件描述符的属性O_NONBLOCK,I/O操作可以立即返回,但是并不保证I/O操作成功。3. 异步事件阻塞I/O: 用户进程可以对I/O事件进行阻塞,但是I/O操作并不阻塞。通过select/poll/epoll等函数调用来达
2009-01-18 10:24:00
17855
3
原创 slab函数分析之free_block
下面分析一下slab对象回收的实现参数:1. slab对象所属的kmem_cache缓存2. slab对象数组3. 需要释放的对象数量4. 在NUMA环境下节点编号static void free_block(struct kmem_cache *cachep, void **objpp, int nr_objects, int node){ int i; struct kme
2009-01-02 13:19:00
2179
原创 slab函数分析之cache_alloc_refill
当array cache中没有可用的object的时候,需要批量从slab缓存中申请对象,这个时候该函数被调用。下面分析一下这个函数。static void *cache_alloc_refill(struct kmem_cache *cachep, gfp_t flags){ int batchcount; struct kmem_list3 *l3; struct array_cache *a
2009-01-02 11:57:00
4807
原创 slab函数分析之cache_grow
当向Slab缓存中提出对象申请的请求时,首先是找到相应的kmem_cache,然后从相应的array cache中分配slab对象。当array cache中没有对象可以分配的时候,会批量向slab缓存中提出对象申请来填满array cache,然后再从array cache中取出一个对象分配出去。如果从slab缓存中分配对象的时候,发现kmem_list3中半满和空闲链表中都没有节点可以供分配:
2008-12-31 23:41:00
1914
1
原创 Slab对象的分配和回收kmem_bufctl_t的用法
在这里我介绍一下Slab对象的分配和回收kmem_bufctl_t的用法,首先要说明的一点是Slab缓存的内存布局,Slab缓存分为两部分,一部分是用于管理Slab对象,另一部分是Slab对象本身,针对这两部分内容,Slab缓存的内存布局大概有两种:1. Slab对象同管理Slab对象的缓存一起存放。2. 分开存放。对于管理区分成2部分,一部分是描述Slab的数据结构,struct slab。
2008-12-29 23:36:00
2674
原创 Slab函数分析之kmem_cache_create函数
该函数用于创建Slab缓存。参数介绍:name: 缓存名字size: 对象的大小align:对齐flag:Slab标志位ctor:对象构造函数dtor:对象析构函数struct kmem_cache *kmem_cache_create (const char *name, size_t size, size_t align, unsigned long flags, void (*ctor)
2008-12-28 14:13:00
13436
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人