JVM中操作系统PageCache(页缓存)对传统BIO和NIO性能的间接支撑

冷漠man

冷漠man

2026-07-26

120人浏览

原创

pagecache是linux内核为提升磁盘i/o性能设计的统一文件数据缓存机制,以页为单位(通常4kb或8kb)缓存文件内容,读写操作默认经由它实现零拷贝加速、异步回写与跨进程共享。

jvm中操作系统pagecache(页缓存)对传统bio和nio性能的间接支撑

PageCache 是 Linux 内核为提升磁盘 I/O 性能而设计的统一缓存机制,它不直接属于 JVM,却深刻影响 Java 程序中 BIO 和 NIO 的实际表现。JVM 本身不管理 PageCache,但所有文件读写操作(无论用 FileInputStream 还是 FileChannel)最终都经过内核路径,从而天然复用 PageCache。这种“间接支撑”不是 JVM 主动参与的结果,而是操作系统层面对 Java I/O 的底层赋能。

PageCache 如何默默加速 BIO 文件读写

BIO(如 FileInputStream + byte[])执行 read() 时,JVM 发起系统调用,内核检查目标文件块是否已在 PageCache 中。若命中,数据直接从内存拷贝到 Java 堆缓冲区;若未命中,则触发磁盘读取并填充 PageCache,再完成拷贝。这意味着:

  • 重复读同一文件段时,第二次起几乎无磁盘开销,仅剩一次内存拷贝(PageCache → 堆)
  • 即使使用 BufferedInputStream,其内部缓冲仍是用户态预读,真正提速靠的还是 PageCache 的预加载与复用
  • write() 同理:数据先落 PageCache(write-back 模式),由内核异步刷盘,应用线程不阻塞在物理写入上

NIO 的 DirectBuffer 与 PageCache 的协同关系

NIO 常用 ByteBuffer.allocateDirect() 创建堆外内存,但这并不绕过 PageCache——关键看具体操作:

Go语言(Golang)Linux版
Go语言(Golang)Linux版

Go语言(Golang)Linux版适合在 Linux 环境中部署 Go 编译工具链,支持服务端开发、微服务、网络程序、容器化项目和自动化工具开发。

下载
  • FileChannel.read(ByteBuffer):若 ByteBuffer 是 direct 类型,内核仍先将数据载入 PageCache,再 DMA 拷贝至 direct memory。此时 PageCache 提供预读、合并写、脏页管理等能力
  • MappedByteBuffer(mmap):这是真正与 PageCache 深度绑定的方式。内存映射区域与文件页一一对应,修改即更新 PageCache,flush() 触发同步刷盘。没有额外拷贝,效率最高
  • 单纯用 direct buffer 并不能跳过 PageCache;绕过它的典型方式是 sendfile()splice() 系统调用(NIO 中通过 FileChannel.transferTo 实现)

为什么高并发场景下 PageCache 对 NIO 更关键

NIO 常用于单线程处理大量连接,每个连接频繁读小块数据(如 HTTP header、消息头)。这类随机读若无 PageCache 支撑,将导致大量磁盘寻道,彻底拖垮吞吐量:

  • PageCache 自动聚合相邻读请求,减少实际 I/O 次数
  • 内核基于 LRU/LFU 等策略保留热数据,使高频访问文件段长期驻留内存
  • NIO 的非阻塞特性依赖内核快速返回就绪状态,而 PageCache 就绪 = 数据已备好,无需等待磁盘响应

开发中容易忽略的 PageCache 影响点

PageCache 的存在让某些行为“看起来正常”,实则掩盖隐患:

  • 写后立即读可能读不到最新内容:因为 write() 只写入 PageCache,尚未刷盘;需显式调用 force() 或依赖 sync 策略
  • 大文件顺序读性能飙升,但随机读仍受限于 PageCache 大小:当文件远超可用内存,PageCache 频繁换入换出,效果衰减
  • 容器环境需注意 /proc/sys/vm/vfs_cache_pressure 等参数:资源受限时,内核可能优先回收 dentry/inode 缓存,间接影响 PageCache 效率

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
视频服务器配置参数有哪些
视频服务器配置参数有哪些

视频服务器配置参数有处理器、内存、存储、视频编解码器、网络接口、视频输入输出接口、操作系统、安全性、环境适应性和成本。在搭建视频服务器时,需要根据实际需求和预算,合理选择这些参数,以实现高性能、高稳定性和低成本的目标。

2023.10.17

1892

11

linux的操作系统介绍
linux的操作系统介绍

Linux是一个灵活、稳定、安全的操作系统,适用于各种不同的应用场景,从个人电脑到服务器和嵌入式系统。想了解更多Linux的相关内容,可以阅读本专题下面的文章。

2024.03.20

1703

12

Linux操作系统的主要用途
Linux操作系统的主要用途

Linux操作系统用途广泛,包括:服务器运营,软件开发,科学研究和教育,嵌入式系统,以及个人电脑和笔记本电脑。想了解更多Linux的相关内容,可以阅读本专题下面的文章。

2024.03.21

2347

8

linux操作系统的作用
linux操作系统的作用

linux操作系统在以下领域发挥着关键作用:服务器和云计算;嵌入式系统;个人电脑和笔记本电脑;超级计算;其他领域等等。想了解更多linux操作系统的相关内容,可以阅读本专题下面的文章。

2024.04.12

1161

5

有哪些常见的网络操作系统
有哪些常见的网络操作系统

常见的网络操作系统有windows server、linux、unix、macos server、freebsd、cisco ios、juniper junos和hp-ux等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.09.12

1615

6

32位操作系统怎么改成62位的
32位操作系统怎么改成62位的

要将 32 位操作系统升级到 64 位,需要遵循以下步骤:1. 检查硬件和软件兼容性;2. 备份数据;3. 获取 64 位操作系统;4. 创建可启动安装媒体;5. 从安装媒体启动计算机;6. 选择“升级”选项;7. 完成安装。

2025.04.02

2393

9

Java I/O 与 NIO 编程体系合集
Java I/O 与 NIO 编程体系合集

全面讲解 Java I/O 编程的演进与核心 API,涵盖传统 I/O 的字节流(InputStream/OutputStream)与字符流(Reader/Writer)体系、装饰器模式在 I/O 中的应用(BufferedReader/InputStreamReader)、文件读写与目录操作、NIO 核心三要素(Buffer 缓冲区/Channel 通道/Selector 选择器)、ByteBuffer 操作与内存映射文件(Mappe

2026.04.29

147

28

Maven零基础入门教程
Maven零基础入门教程

本合集由PHP中文网精心整理,提供Maven零基础入门到完整使用的保姆级教程。内容涵盖环境安装、核心配置、仓库管理及项目构建等核心知识点。通过详细步骤解析与代码示例,助你快速掌握Maven的依赖管理与自动化构建,轻松解决Java项目中的各种痛点,是新手入门与进阶的必备指南。

2026.08.05

2

18

Maven安装及配置教程
Maven安装及配置教程

本合集由PHP中文网精心整理,提供Maven安装配置与环境配置详情指南。内容涵盖Maven下载、解压安装、环境变量配置、阿里云镜像加速及本地仓库修改等全流程。教程通俗易懂,帮助开发者轻松解决依赖管理难题,快速掌握Maven核心构建技能,是Java开发者的必备实战指南。

2026.08.05

2

24

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
ubuntu官方总文档
ubuntu官方总文档

共0课时 | 0人学习

PostgreSQL 教程
PostgreSQL 教程

共48课时 | 19万人学习

C 教程
C 教程

共75课时 | 8.1万人学习