自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(30)
  • 收藏
  • 关注

原创 System.gc 之后到底发生了什么 ?

本文基于 OpenJDK17 进行讨论在 JDK NIO 针对堆外内存的分配场景中,我们经常会看到 System.gc 的身影,比如当我们通过对文件进行内存映射的时候,如果 JVM 进程虚拟内存空间中的虚拟内存不足,JVM 在 native 层就会抛出。当 JDK 捕获到异常的时候,就会意识到此时进程虚拟内存空间中的虚拟内存已经不足了,无法支持本次内存映射,于是就会调用System.gc。

2024-04-01 20:03:24 927

原创 MappedByteBuffer VS FileChannel:从内核层面对比两者的性能差异

本文基于 Linux 内核 5.4 版本进行讨论自上篇文章发布之后,很多读者朋友私信我说,文章的信息量太大了,其中很多章节介绍的内容都是大家非常想要了解,并且是频繁被搜索的内容,所以根据读者朋友的建议,笔者决定将一些重要的章节内容独立出来,更好的方便大家检索。

2024-03-28 12:43:40 1016

原创 从 Linux 内核角度探秘 JDK MappedByteBuffer

在之前的文章《一步一图带你深入剖析 JDK NIO ByteBuffer 在不同字节序下的设计与实现》 中,笔者为大家详细剖析了 JDK Buffer 的整个设计体系,从总体上来讲,JDK NIO 为每一种 Java 基本类型定义了对应的 Buffer 类(boolean 类型除外)。而 Buffer 本质上其实是 JDK 对 OS 中某一段内存在 Java 语言层面上的封装,当然了,这里的内存指的是虚拟内存,我们需要从之前文章中的内核空间视角切换到用户空间上来,所以本文提到的内存如无特殊说明均是指虚拟

2024-03-19 19:21:45 679 1

原创 一文聊透 Linux 缺页异常的处理 —— 图解 Page Faults

在前面两篇介绍 mmap 的文章中,笔者分别从原理角度以及源码实现角度带着大家深入到内核世界深度揭秘了 mmap 内存映射的本质。从整个 mmap 映射的过程可以看出,内核只是在进程的虚拟地址空间中寻找出一段空闲的虚拟内存区域 vma 然后分配给本次映射而已。如果是文件映射的话,内核还会额外做一项工作,就是将分配出来的这段虚拟内存区域 vma 与映射文件关联映射起来。映射的核心就是将虚拟内存区域 vm_area_struct 相关的内存操作 设置为文件系统的相关操作 。这样一来,进程后续对这段虚拟内存

2023-12-23 11:51:47 855 2

原创 从内核世界透视 mmap 内存映射的本质(源码实现篇)

到现在为止,笔者通过两篇文章,一篇原理,一篇源码,深入到内核世界中,将 mmap 内存映射的本质给大家呈现了出来,知识点比较密集且比较烧脑,因此笔者又画了一副 mmap 内存映射的整体思维导图方便大家回顾。在原理篇中笔者首先通过五个角度为大家详细介绍了 mmap 的使用方法及其在内核中的实现原理,这五个角度分别是:私有匿名映射,其主要用于进程申请虚拟内存,以及初始化进程虚拟内存空间中的 BSS 段,堆,栈这些虚拟内存区域。

2023-10-10 11:29:10 315 1

原创 从内核世界透视 mmap 内存映射的本质(原理篇)

本文笔者从五个角度为大家详细介绍了 mmap 的使用方法及其在内核中的实现原理,这五个角度分别是:私有匿名映射,其主要用于进程申请虚拟内存,以及初始化进程虚拟内存空间中的 BSS 段,堆,栈这些虚拟内存区域。私有文件映射,其核心特点是背后映射的文件页在多进程之间是读共享的,多个进程对各自虚拟内存区的修改只能反应到各自对应的文件页上,而且各自的修改在进程之间是互不可见的,最重要的一点是这些修改均不会回写到磁盘文件中。

2023-09-18 18:33:10 345

原创 一步一图带你构建 Linux 页表体系 —— 详解虚拟内存如何与物理内存进行映射

本文笔者通过页表体系这条主线脉络,为大家串讲了一下之前介绍的虚拟内存管理以及物理内存管理的相关内容,在我们回顾完虚拟内存管理和物理内存管理之后,随后我们引出了虚拟内存如何与物理内存进行映射这个问题,并在这个过程中为大家揭露了页表的本质。在我们清楚了页表的本质之后,笔者又沿着页表体系的演进这条主线,对单级页表,二级页表,四级页表展开了介绍,其中花了一定的篇幅为大家详细的介绍了 32 位和 64 位页表项以及页目录想的比特位布局,让大家真真实实的看到了页表项和页目录项到底长什么样子。

2023-07-21 17:11:12 807 1

原创 深度解读 Linux 内核级通用内存池 —— kmalloc 体系

整个 kmalloc 通用内存池体系的核心是围绕着 kmalloc_caches 这个二维数组召开的。其中一维数组中定义的是 kmalloc 内存池中的内存来源,在内核中使用。

2023-06-21 11:35:54 540

原创 深度解析 slab 内存池回收内存以及销毁全流程

整个 slab cache 系列篇幅非常庞大,涉及到的细节非常丰富,为了方便大家回顾,笔者这里将 slab cache 系列涉及到的重点内容再次梳理总结一下。

2023-05-26 11:44:06 290 5

原创 深入理解 slab cache 内存分配全链路实现

本文我们基于 slab cache 的完整的架构,近一步深入到内核源码中详细介绍了 slab cache 关于内存分配的完整流程:我们可以看到 slab cache 内存分配的整个流程分为 fastpath 快速路径和 slowpath 慢速路径。其中在 fastpath 路径下,内核会直接从 slab cache 的本地 cpu 缓存中获取内存块,这是最快的一种方式。从本地 cpu 缓存 partial 列表中分配从 NUMA 节点缓存中分配,其中涉及到了对本地 cpu 缓存的填充。

2023-05-05 11:50:14 205

原创 从内核源码看 slab 内存池的创建初始化流程

本文笔者基于内核 5.4 版本,从源码角度详细讨论了 slab cache 的创建初始化过程,创建流程如下图所示:经过该流程的创建之后,我们得到了如下图所示的 slab cache 架构:在这个过程中,笔者又近一步从源码角度介绍了内核具体是如何对 slab 对象进行内存布局的。在这个内存布局的基础上,笔者又近一步展开了内核如何计算一个 slab 到底需要多少个物理内存页,以及一个 slab 到底能够容纳多少内存块的相关逻辑。

2023-04-12 10:22:52 279 2

原创 细节拉满,80 张图带你一步一步推演 slab 内存池的设计与实现

本文在伙伴系统的基础上又为大家详细介绍了一款内核专门应对小内存块管理的 slab 内存池,并列举了 slab 内存池在内核中的几种应用场景。

2023-04-05 11:33:56 454

原创 深度剖析 Linux 伙伴系统的设计与实现

我们前面一直在谈伙伴系统,那么伙伴这个概念到底在内核中是什么意思呢?其实下面这张伙伴系统的结构图已经把伙伴的概念很清晰的表达出来了。伙伴在我们日常生活中含义就是形影不离的好朋友,在内核中也是如此,内核中的伙伴指的是大小相同并且在物理内存上是连续的两个或者多个 page。比如在上图中,free_area[1] 中组织的是分配阶 order = 1 的内存块,内存块中包含了两个连续的空闲 page。这两个空闲 page 就是伙伴。

2023-02-04 09:17:26 450 3

原创 深入理解 Linux 物理内存分配全链路实现

本文首先从 Linux 内核中常见的几个物理内存分配接口开始,介绍了这些内存分配接口的各自的使用场景,以及接口函数中参数的含义。并以此为起点,结合 Linux 内核 5.19 版本源码详细讨论了物理内存分配在内核中的整个链路实现。在整个链路中,内存的分配整体分为了两个路径:快速路径 fast path:该路径的下,内存分配的逻辑比较简单,主要是在 WMARK_LOW 水位线之上快速的扫描一下各个内存区域中是否有足够的空闲内存能够满足本次内存分配,如果有则立马从伙伴系统中申请,如果没有立即返回。

2023-01-02 12:33:44 469 3

原创 一步一图带你深入理解 Linux 物理内存管理

图解 Linux 物理内存管理

2022-11-22 12:27:50 738 7

原创 一步一图带你深入理解 Linux 虚拟内存管理

图解 Linux 虚拟内存管理

2022-10-25 13:22:08 916 15

原创 从 Linux 内核角度探秘 JDK NIO 文件读写本质

带你彻底打通 Linux 文件 IO 相关的知识系统脉络

2022-09-06 19:05:46 345

原创 一步一图带你深入剖析 JDK NIO ByteBuffer 在不同字节序下的设计与实现

让我们来到微观世界重新认识netty

2022-08-11 15:14:11 217 4

原创 Java 技术栈中间件优雅停机方案设计与实现全景图

从内核的信号量开始聊起一直到 JVM,Spring,Dubbo最后到 Netty,一文详尽优雅停机的前世今生

2022-07-09 12:28:00 329

原创 我为 Netty 贡献源码 | 且看 Netty 如何应对 TCP 连接的正常关闭,异常关闭,半关闭场景

Netty 关于处理 TCP 连接关闭时所需要面对的所有场景,你想知道吗?本文会全面清晰地告诉你答案!!!

2022-06-16 21:59:08 3023 4

原创 一文聊透 Netty IO 事件的编排利器 pipeline | 详解所有 IO 事件的触发时机以及传播路径

你是否面对 Netty 提供的众多异步回调函数而感到无从下手?你是否不清楚 Netty 究竟定义了哪些异步 IO 事件?你是否对这些异步 IO 事件的触发时机以及传播路径感到模糊?你是否好奇 Netty 如何通过 pipeline 灵活高效地编排这些 IO 事件?你是否好奇 Netty 如何设计实现这样一个工业级的责任链模式 pipeline?本文会从源码角度告诉你正确的答案!

2022-05-16 19:51:12 516 1

原创 一文搞懂Netty发送数据全流程 | 你想知道的细节全在这里

关于Netty如何高效地发送网络数据,你想知道的所有细节都在这里

2022-04-08 13:22:12 3994

原创 抓到Netty一个隐藏很深的内存泄露Bug | 详解Recycler对象池的精妙设计与实现

本文介绍了笔者如何发现了Netty一个隐藏很深的内存泄露相关的Bug,并详细介绍了Bug的修复过程。基于这个契机,详细剖析了对象池在Netty中的一些精妙设计和源码实现

2022-03-19 12:08:49 1035 2

原创 一文聊透对象在JVM中的内存布局,以及内存对齐和压缩指针的原理及应用

文章从计算机组成原理的角度详细阐述了对象在Jvm内存中的布局,以及字段排列规则。后面介绍了内存对齐,以及为什么要内存对齐,还有Jvm中压缩指针的原理及应用。中间介绍了false sharing产生的原因以及造成的性能影响和修复方案

2022-03-05 12:23:50 493

原创 Netty如何高效接收网络数据?一文聊透ByteBuffer动态自适应扩缩容机制

本文介绍了Netty如何高效接收网络连接全流程并深入剖析了ByteBuffer动态自适应扩缩容机制。阐述了为什么会使用堆外内存来为ByteBuffer分配内存,由此引出了Netty的内存池PooledByteBufAllocator

2022-02-23 11:38:21 964 2

原创 抓到Netty一个Bug,顺带来透彻地聊一下Netty是如何高效接收网络连接的

抓到Netty一个Bug!!于是把发现修复Bug的过程总结成文,介绍一下Bug产生的原因,造成的影响,以及最终的修复方案。同时详细介绍一下Netty是如何高效的接收网络连接的!

2022-02-11 16:14:10 1413 1

原创 一文聊透Netty核心引擎Reactor的运转架构

介绍了Reactor整体的运行框架,并深入介绍了Reactor核心的工作模块的具体实现逻辑。通过本文的介绍我们知道了Reactor如何轮询注册在其上的所有Channel上感兴趣的IO事件,以及Reactor如何去处理IO就绪的事件,如何执行Netty框架中提交的异步任务和定时任务。最后介绍了Netty如何巧妙的绕过JDK NIO Epoll空轮询的BUG,达到解决问题的目的

2022-01-29 10:28:32 1599

原创 详细图解Netty Reactor启动全流程

本文我们通过图解源码的方式完整地介绍了整个Netty服务端启动大家第一眼看到这幅流程图,是不是脑瓜子嗡嗡的呢?大家先不要惊慌,问题不大,本文笔者的目的就是要让大家清晰的理解这幅流程图,从而深刻的理解Netty Reactor的启动全流程,包括其中涉及到的各种代码设计实现细节。在上篇文章《聊聊Netty那些事儿之Reactor在Netty中的实现(创建篇)》中我们详细介绍了Netty服务端核心引擎组件主从Reactor组模型 NioEventLoopGroup以及Reactor模型 NioEv.

2022-01-19 15:54:36 849 8

原创 聊聊Netty那些事儿之Reactor在Netty中的实现(创建篇)

本文介绍了netty对各种IO模型的支持,以及主从Reactor模型在netty中的创建过程,netty对JDK NIO原生Selector的优化

2022-01-13 19:56:05 742 2

原创 聊聊Netty那些事儿之从内核角度看IO模型

IO模型的选择是构建一个高性能网络框架的基础,我们来分别从内核空间和用户空间的角度来一起探讨下五种IO模型和两种IO线程模型的实现

2022-01-12 22:19:24 814 3

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除