谁生?谁死?从引用计数到可达性分析,洞悉GC的决策逻辑
引用计数与可达性分析:谁死了,谁还活着? 垃圾回收,顾名思义,便是将已经分配出去的,但却不再使用的内存回收回来,以便能够再次分配。在Java虚拟机的语境下,垃圾指的是死亡的对象所占据的堆空间。这里便涉及了一个关键的问题:如何辨别一个对象是存是亡? 引用计数 引用计数(Reference Counti ...
压缩指针:64位系统下,Java虚拟机是如何“偷”回4字节内存的?
Java对象:在内存中的真面目 在Java中,通过new关键字创建一个Java类的实例对象时,该对象会通过碰撞指针方式存储在内存的堆中,并被分配一个内存地址。在Java虚拟机中,一个Java对象由对象头(Object Header)、实例数据(Instance Data)和对齐填充(Padding) ...
JWT令牌
该笔记介绍SpringBoot中JWT令牌的使用,内容涵盖Maven依赖坐标配置、JWT生成方法(设置算法、自定义声明、签名及过期时间)、JWT解析验证(验证签名、过期时间等)以及配置映射(YAML配置与JwtProperties类实现配置管理),并提供了完整的Java代码实现示例。 ...
为什么Java/Python程序无需关心内存释放?揭秘垃圾回收(GC)的核心概念
在Java的编程世界里,开发者既无需也无法像C/C++那样手动调用malloc/free来管理内存的分配与回收,这一核心任务完全由Java虚拟机在幕后自动完成。这种自动化设计极大地简化了编码,将开发者从繁琐且极易出错的内存管理中解放出来。然而,这种便利性的背后隐藏着一个经典且复杂的难题:一个动态运行 ...
jemalloc思想的极致演绎:深度解构Netty内存池的精妙设计与实现
内存分配 Netty内存池的核心设计借鉴了jemalloc的设计思想。jemalloc是由Jason Evans在FreeBSD项目中实现的高性能内存分配器,其核心优势在于通过细粒度内存块划分与多层级缓存机制,降低内存碎片率并优化高并发场景下的内存分配吞吐量。 Netty基于jemalloc的多Ar ...
“化零为整”的智慧:内存池如何绕过系统调用和GC,构建性能的护城河
内存池:精打细算的内存管家 在高性能系统(如网络服务器)的极致优化中,当处理器和I/O的瓶颈被逐一攻克后,内存管理便成为决定系统延迟和吞吐量的最后一道,也是最关键的一道关隘。传统的内存分配方式在这种场景下显得力不从心,催生了通过内存池(Memory Pool)作为管理策略。 在C/C++或Java等 ...
职责分离的艺术:剖析主从Reactor模型如何实现极致的并发性能
Reactor单线程模型 在Reactor单线程模型中,所谓的“单线程”主要针对I/O操作而言,即所有的I/O操作(如accept()、read()、write()和connect())都在同一个线程上完成。然而,在当前的单线程Reactor模型中,不仅I/O操作由Reactor线程处理,非I/O的 ...
从C10K到Reactor:事件驱动,如何重塑高并发服务器的网络架构
事件驱动 事件驱动(Event Driven)是一种核心的编程范式,其根本特征是控制反转(Inversion of Control,IoC)。在这种模型中,程序的执行流不再由代码的顺序调用决定,而是由一系列异步发生的事件来驱动。应用程序的角色从主动轮询或等待,转变为被动地对事件做出响应,这构成了现代 ...
单线程如何撑起百万连接?I/O多路复用:现代网络架构的基石
I/O多路复用(I/O Multiplexing)是一种允许单个线程同时监视多个文件描述符的I/O模型。其核心价值在于,它将应用程序从低效的I/O等待中解放出来,实现了“一次等待,响应多个事件”的高效并发模式。 要理解其优势,需要对比非阻塞I/O的局限性。虽然非阻塞I/O能避免线程在数据未就绪时阻塞 ...
你的程序为何卡顿?从LINUX I/O三大模式寻找答案
I/O交互流程 在LINUX中,内核空间和用户空间都位于虚拟内存中。LINUX采用两级保护机制:0级供内核使用,3级供用户程序使用。每个进程都有独立的用户空间(0~3G),对其他进程不可见,而最高的1G虚拟内核空间则由所有进程和内核共享。 操作系统和驱动程序运行在内核空间,应用程序运行在用户空间。由 ...
“一切皆文件”:揭秘LINUX I/O与虚拟内存的底层设计哲学
RPC框架如同构建服务大厦的神经网络,承担着海量服务间通信的重任。它优雅地屏蔽了底层网络通信的复杂性,使开发者能聚焦于业务逻辑的创造。然而,在这份优雅之下,RPC框架的网络模型设计却是决定系统吞吐量、延迟和资源利用率的命脉,其核心在于在有限的硬件资源与无限的数据洪流之间,建立一座高效、动态的桥梁。 ...
Goroutine间的“灵魂管道”:Channel如何实现数据同步与因果传递?
Channel是连接Goroutine的“管道”,是CSP理念在Golang中的具象化实现。它不仅是数据传递的队列,更是Goroutine间同步的天然工具,让开发者无需诉诸显式的锁或条件变量。 func main() { ch := make(chan int, 1) // 创建一个int,缓冲区大 ...
“不要通过共享内存来通信”——深入理解Golang并发模型与CSP理论
Golang 在设计上另辟蹊径,其并发哲学的核心信条是:“不要通过共享内存来通信,而要通过通信来共享内存。” (Do not communicate by sharing memory; instead, share memory by communicating.) 这一理念源自通信顺序进程(Co ...
Ros2_control浅析——一个机器人开发通用框架的结构(1)
引言: 最近在开发一个送餐机器人,但是在电机和ros2系统交互时犯了难,不知道该怎么写才能让系统架构清晰一些,后来了解到ros2社区有一个规范的开发框架,所以我会结合个人理解来分析一下这个架构,算是我的学习笔记吧,希望能够对您有帮助! ros2_control是什么 ros2_control 是一个 ...
揭秘JUC:volatile与CAS,并发编程的两大基石
JUC(java.util.concurrent)并发包,作为Java语言并发编程的利器,由并发编程领域的泰斗道格·利(Doug Lea)精心打造。它提供了一系列高效、线程安全的工具类、接口及原子类,极大地简化了并发编程的开发流程与管理复杂度。 JUC并发包与happens-before、内存语义的 ...
经典三层架构项目(3-tier architecture)中应用依赖倒置原则(DIP)的理性权衡
1 DIP核心思想与三层架构概述 依赖倒置原则(Dependency Inversion Principle,DIP)作为SOLID原则中的重要组成部分,其核心主张是高层模块不应依赖低层模块,两者都应依赖于抽象;抽象不应依赖细节,细节应该依赖抽象。 在经典三层架构(表示层-业务逻辑层-数据访问层)中 ...
vivo 浏览器福利体系架构演进之路
vivo 浏览器为应对多场景金币激励需求及旧架构流量、IO等痛点,升级福利中心架构。服务层面拆分流量与业务,打造金币集散中心;数据层面分库分表、拆解大表并优化流水设计;通过仲裁系统和软事务保障数据一致性。改造后,系统可支撑千万级DAU,性能稳定提升,物理存储成本降低,解决了流量与存储压力,成为高可用... ...
从MESA模型到锁升级:synchronized性能逆袭的底层逻辑
管程(Monitor)是一种用于管理共享资源访问的程序结构,能确保同一时刻只有一个线程访问共享资源,解决并发编程中的互斥和同步问题。MESA模型是管程的经典实现,主要由入口等待队列和条件变量等待队列构成。 1)入口等待队列:确保线程互斥,多个线程试图进入管程时,仅一个线程能成功,其余线程在入口等待 ...
一把锁的两种承诺:synchronized如何同时保证互斥与内存可见性?
在多线程环境中,临界区(Critical Section)是指一次只能由一个线程执行的代码段,这些代码通常涉及对共享资源(如变量、数据结构、文件或数据库连接)的访问或修改。临界区的存在是为了解决并发控制中的两大核心问题。 1)数据不一致性:如果多个线程同时对共享资源进行写操作,可能会破坏数据 ...
从混沌到秩序:Java共享内存模型如何通过显式约束驯服并发?
并发编程的本质,是在看似混沌的并行执行中建立秩序,确保程序的确定性。为达此目的,并发原语应运而生,它们是构筑一切并发系统的基石。其核心使命在于,通过定义一套明确的交互范式,消除因资源共享而引发的竞态条件(Race Condition),从而驯服并发世界的不确定性。 从Java的显式锁(synchro ...



