IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

标签:内存优化

共 10 篇相关文章

IT 累计浏览 1,826

缓存那些事

这篇讲的是缓存体系中的“十八般武艺”。作者从最前端的浏览器缓存头(If-Modified-Since)谈起,带我们看到了CDN层面的不同玩法:CSI、SSI和ESI。文章特别指出了ESI在App接口场景下的适用性,以及在高并发要求下,直接生成静态文件上传CDN的硬核方案。 视线转向应用层,文章拆解了local cache、Redis、Tair构成的多级缓存策略。以当当网交易链路为例,设置了1分钟的本地缓存过期时间,在一致性与性能间取得了平衡。对于开发者常头疼的缓存击穿问题,文章清晰地列举了三种场景:缓存过期、数据不存在和缓存宕机,并分别给出了“加锁防雪崩”、“空对象防穿透”和“DB裸压保底”的实战心法。 此外,文章还延伸到了提升用户体验的pjax局部更新与bigpipe分段输出技术。最后,作者将笔触落到缓存优化的细微处——通过精简Key、使用slim object序列化以及Gzip/Brotli压缩,从一点点缩减对象大小入手,来节省整个缓存池子的资源。这是一份从浏览器到服务器、从架构到细节的缓存实践地图。

IT 累计浏览 1,448

Android APP内存优化之图片优化

这篇讲的是作者在开发一款小学教育APP时,面对高分辨率设备上图片内存占用过大的实际挑战。在2K屏(2048×1536)上,单张背景图就能消耗12MB内存,频繁切换页面导致内存飙升至百兆级别。文章聚焦于这一痛点,分享了几项针对性的图片内存优化实践。 作者首先发现一个容易被忽视的细节:为Button设置selector背景会同时加载正常与按下两张图片,导致内存占用翻倍。解决方案是通过监听触摸事件动态切换背景,或使用setColorFilter实现反选效果,既节省内存也减小APK体积。其次,针对绘制大背景图时的界面卡顿问题,作者提出将背景绘制任务移至非UI线程,通过自定义的RootSurfaceView在SurfaceFlinger中完成渲染,从而避免阻塞主线程,提升了APP的流畅度。 这些方法均源于实际项目中的摸索,虽未深入底层原理,但提供了清晰、可落地的优化思路,特别适合处理图片密集型应用的内存与性能平衡问题。

IT 累计浏览 6,359

如何编写一个JSON解析器

这篇讲的是如何从头实现一个JSON解析器。作者从JSON解析器的基本定义出发——即将JSON字符串转换为语言内存中的数据结构,对比了它与XML的差异,并梳理了JSON基本类型与Java数据结构(如Map、List)的映射关系。 文章的核心在于拆解实现思路。它强调解析器应采用流式单次扫描,本质是一个状态机。实现的关键步骤被清晰地勾勒出来:首先,需要封装一个`CharReader`来支持`peek()`操作,以便在不移动指针的情况下预判字符;其次,将原始字符流进一步抽象为Token流(如`BEGIN_OBJECT`、`STRING`等),从而大幅简化状态判断逻辑。最后,文章点出了处理嵌套结构的技巧:利用栈来管理Object和Array的构建,遇到开始标记时创建对应的Map或List并压栈,以此高效地完成递归解析。 整个实现过程体现了从具体到抽象、逐步化繁为简的设计思想,将看似复杂的解析任务分解为字符读取、Token识别和栈操作几个清晰的模块。

IT 累计浏览 2,738

深入剖析 redis 数据结构 ziplist

这篇讲的是 Redis 中为了极致节省内存而设计的压缩链表 ziplist 的实现细节。作者从 Redis 的 list 结构有两种底层实现(普通双链表和 ziplist)切入,重点剖析了后者。 ziplist 的核心巧妙之处在于,它用一段连续的内存空间模拟了双向链表的功能,从而省去了每个节点额外的前驱和后驱指针开销(每个指针8字节)。文章详细拆解了 ziplist 的整体格式以及每个 entry 的 TLV(类型-长度-值)结构,特别是通过 `prelen` 字段记录前一项的长度来实现反向遍历,通过精心设计的 `encoding` 字段对不同长度的字符串和整数进行紧凑编码。 通过分析 `ziplistFind()` 函数的源码,文章展示了 ziplist 如何进行数据查找与比较。最后,文章点明了 ziplist 在 Redis 中的实际应用场景(如 Hash 结构在数据量小时的底层存储),并解释了它的性能优势:紧凑的线性内存布局不仅节省空间,还可能更好地利用 CPU 缓存,使得在数据量较小时,其查找性能甚至可以媲美哈希表。

IT 累计浏览 2,699

关于大区间过滤优化内存设计

这篇讲的是在检索场景下,如何优化“大区间过滤”时的内存结构设计。作者指出,传统做法中以 docId 为下标存储域值的方式存在内存浪费,尤其在域值(如日期类型)重复率很高的场景下。 核心方案是引入两个互补的数组:第一个数组以域 Term 的遍历位置(Position)为下标,直接存储对应的域值,这利用了域值在遍历过程中天然有序的特点;第二个数组则以 docId 为下标,存储该文档在第一个数组中的对应位置。这样一来,大量重复的域值(例如“20101202”)在第一个数组中只存储一次,通过第二个数组的间接映射,就能为每个 docId 快速定位到其域值。 作者通过示意图和实际业务分析说明,对于时间这类重复率极高的域,该设计能显著压缩内存占用。整个方案的精髓在于通过空间换时间的思想,巧妙地将高重复的域值“去重”存储,并用一次额外的间接查找换取整体内存效率的提升。

IT 累计浏览 4,918

Nginx使用Linux内存加速静态文件访问

这篇讲的是一个针对 Nginx 的性能压榨方案:当默认的磁盘 IO 在高并发下成为瓶颈时,如何进一步突破它。 作者从 Nginx 作为静态资源服务器的出色表现切入,但指出在极端压力下,磁盘的随机读写仍是短板。核心方案是利用 Linux 内核的 mmap 系统调用,将静态文件直接映射到内存中。这样,后续的请求就可以绕过文件系统,从内存直接提供文件数据,从而减少内核空间与用户空间之间的切换以及磁盘 IO 开销。 这个优化并非 Nginx 原生支持,需要通过第三方模块或自定义配置来实现。文章的关键在于点明了这种“内存优先”策略的适用场景:当你的静态文件访问量极大、且 IO 等待已成为主要延迟来源时,将热文件驻留内存能带来立竿见影的效果。这本质上是一种用内存空间换取响应速度和吞吐量的经典权衡。

IT 累计浏览 3,834

redis内存容量的预估和优化

这篇讲的是Redis内存管理中一个很实际的问题:如何在数据写入前就预估并控制内存占用。作者从Redis全内存存储的特性出发,聚焦于最常用的string和zipmap(即压缩列表)两种数据结构,深入分析了它们在jemalloc内存分配器下的实际内存开销计算方法。 文章没有泛泛而谈理论,而是提供了具体的计算公式和考量因素。例如,对于string类型,除了数据本身,还详细拆解了jemalloc的内存分配策略(如16字节的chunk和size class)如何影响最终占用;对于zipmap,则解析了其内部结构的字节级开销,让读者能像拼图一样算出真实内存。在此基础上,作者分享了针对性的优化技巧,比如控制键值长度、利用ziplist编码阈值等,都是能直接落地操作的建议。 对于正在面对Redis内存压力或想精细化运维的工程师来说,这篇文章提供了一套从预估到优化的完整思路,帮助你在资源规划时做到心中有数,避免线上突发内存不足的窘境。

IT 累计浏览 7,344

让Redis使用TCMalloc,实现高性能NOSql服务器

这篇讲的是如何通过替换内存分配器来给Redis性能“提速”。作者从Redis在高并发场景下可能遇到的内存管理瓶颈切入,指出其默认使用的glibc malloc在高并发时可能成为性能拖累。核心方案是引入Google的开源工具TCMalloc,文章详细阐述了其“线程缓存”机制如何通过为每个线程维护独立的内存缓存,极大减少锁竞争和系统调用开销。 文章没有停留在理论对比,而是给出了清晰的实操步骤,包括如何编译TCMalloc、如何修改Redis的启动配置来使其生效。最后,作者通过实际的性能测试数据,展示了启用TCMalloc后,Redis在吞吐量和响应延迟上获得的显著改善。这对于需要进一步挖掘Redis性能潜力、优化高频交易或缓存服务的技术团队,提供了一个具体且有效的调优思路。

IT 累计浏览 3,184

一种比较省内存的稀疏矩阵Python存储方案

这篇讲的是推荐系统场景下,如何更高效地处理稀疏矩阵的问题。作者从常见的 user-item-rating 三元组数据出发,指出其本质就是数学中的稀疏矩阵,并点明了 scipy.sparse 模块在此场景下的两个痛点:一是切片操作效率不高,无法灵活快速地按行或按列取数;二是所有数据驻留内存,难以应对海量数据。 为了解决这些问题,文章提出了一套自己的存储方案。核心思路是利用 Python 字典建立高效索引,并将实际数据存储在内存映射文件中。字典索引让 data[i, ...] 和 data[..., j] 这类操作变得直接而迅速;内存映射则将数据放在磁盘上按需加载,从而突破了内存限制,使处理超大规模数据成为可能。 作者通过代码和对比说明了该方案如何具体实现,比如用字典存储行索引和对应的数据块。整个方案的目标明确,就是为推荐系统这类既需要灵活查询又面临数据规模挑战的场景,提供一个在内存效率和访问性能上更平衡的选择。

IT 累计浏览 5,667

Linux 64位, MySQL, Swap & Memory 优化

这篇讲的是如何在64位Linux环境下,针对MySQL的Swap和内存使用进行优化以提升性能。 文章从一个常见的性能瓶颈场景切入:当MySQL运行在64位Linux系统上时,系统默认的内存管理与交换空间(Swap)策略可能并不适合数据库这种内存密集型应用。作者指出,即便物理内存充足,系统也可能因不当的Swap配置导致性能下降。 核心方案聚焦在两个关键参数的调整上:`vm.swappiness` 和 `vm.overcommit_memory`。文章详细解释了这两个参数如何影响操作系统将MySQL的内存页面交换到磁盘的倾向,以及如何处理内存分配请求。通过具体的配置建议和调整逻辑,目标是让MySQL尽可能多地使用物理内存,减少昂贵的磁盘交换操作,从而降低延迟、提高查询吞吐量。 最后,文章通过对比优化前后的可能效果,说明这类系统层面的调优往往能带来立竿见影的性能改善,尤其是在内存压力较大的生产环境中。对于负责MySQL运维和性能优化的技术人员来说,这是一个值得审视和调整的基础配置方向。