【缓冲区】数据库备份的衍生问题,缓冲区在哪里?JVMor操作系统?(二)

【缓冲区】数据库备份的衍生问题,缓冲区在哪里?JVMor操作系统?(二 完结)

缓冲区既属于操作系统 ,也属于 JVM,具体取决于你讨论的是哪个层面的缓冲区。下面我会详细解释这两者的区别和联系。


1. 操作系统级别的缓冲区

当你通过 Java 启动一个外部进程(例如 osrexp)时,操作系统会为这个进程分配资源,包括输入、输出和错误流的缓冲区。这些缓冲区是由操作系统管理的。

特点:
  • 位置:位于操作系统的内核空间。
  • 大小:由操作系统决定,通常是几 KB 到几十 KB。
  • 作用:临时存储外部进程的输出数据,直到这些数据被读取或丢弃。
  • 可见性:对用户和应用程序是透明的,无法直接访问或修改。
示例:

当你运行以下代码时:

java 复制代码
Process process = new ProcessBuilder("osrexp", "-u", "SYSDBA/szoscar55").start();

操作系统会为 osrexp 进程分配以下缓冲区:

  • 标准输出流(stdout):存储命令的正常输出。
  • 标准错误流(stderr):存储命令的错误信息。

这些缓冲区是操作系统级别的,Java 程序通过 Process.getInputStream() 和 Process.getErrorStream() 从这些缓冲区中读取数据。


2. JVM 级别的缓冲区

当你通过 Java 读取外部进程的输出流时,JVM 会使用自己的缓冲区来存储从操作系统缓冲区中读取的数据。

特点:
  • 位置:位于 JVM 的堆内存中。
  • 大小:由 JVM 决定,通常是几 KB。
  • 作用:提高读取效率,减少频繁的系统调用。
  • 可见性 :可以通过 Java 代码间接操作(例如使用 BufferedReader)。
示例:

当你使用以下代码读取外部进程的输出时:

java 复制代码
try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
    String line;
    while ((line = reader.readLine()) != null) {
        System.out.println(line);
    }
}
  • BufferedReader 是 JVM 提供的一个缓冲读取器,它会从操作系统的缓冲区中读取数据,并存储在自己的缓冲区中。
  • BufferedReader 的默认缓冲区大小是 8192 字节(8 KB)。

3. 两者的关系

  • 操作系统缓冲区:是外部进程输出数据的第一个存储位置。
  • JVM 缓冲区:是 Java 程序从操作系统缓冲区中读取数据时的第二个存储位置。
数据流动过程:
  1. 外部进程(例如 osrexp)将输出数据写入操作系统的缓冲区。
  2. Java 程序通过 Process.getInputStream() 从操作系统的缓冲区中读取数据。
  3. 读取的数据会被存储到 JVM 的缓冲区中(例如 BufferedReader 的缓冲区)。
  4. Java 程序从 JVM 的缓冲区中获取数据并处理。

4. 如何验证缓冲区的存在?

验证操作系统缓冲区:
  • 如果你不读取外部进程的输出流,操作系统的缓冲区会逐渐被填满,最终导致外部进程卡住。这是操作系统缓冲区存在的间接证据。
验证 JVM 缓冲区:
  • 如果你使用 BufferedReader,可以通过调整缓冲区大小来观察性能变化。例如:
java 复制代码
// 设置 BufferedReader 的缓冲区大小为 16 KB
try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()), 16384)) {
    String line;
    while ((line = reader.readLine()) != null) {
        System.out.println(line);
    }
}
  • 通过调整缓冲区大小,你可以观察到读取效率的变化,这是 JVM 缓冲区存在的间接证据。

5. 总结

  • 操作系统缓冲区:由操作系统管理,用于存储外部进程的输出数据。
  • JVM 缓冲区:由 JVM 管理,用于提高读取外部进程输出数据的效率。
  • 两者的关系:数据从操作系统缓冲区流向 JVM 缓冲区,最终被 Java 程序处理。
相关推荐
于眠牧北16 分钟前
Charles配置指定域名抓取和雷电模拟器中抓取APP接口配置
数据库·redis·缓存
福娃筱欢32 分钟前
57014 canceling statement due to user request(金仓 KingbaseES)
数据库·kingbase·金仓数据库
ClouGence41 分钟前
SAP HANA 数据同步遇到长事务,如何兼顾实时性与完整性?
数据库·后端
数据库小学妹1 小时前
数据库管理工具有哪些?2026主流工具分类与选型对照
数据库·数据库管理工具·数据库工具·信创数据库·数据库客户端
bingHHB1 小时前
销售订单同步实战:MES生产领料/补料→金蝶材料出库
数据库·集成测试
yexianglunbai1 小时前
冷备份与热备份的区别详解
数据库
ZhengEnCi1 小时前
SQL 与 NoSQL 本质差异完全指南:从数据模型到选型决策的深度剖析
数据库
龙腾AI白云1 小时前
数字孪生:与人工智能融合的技术图景
大数据·数据库·人工智能·知识图谱
夜雪一千1 小时前
MySQL中修改JSON类型的数据实战
数据库·mysql·json
竣达技术2 小时前
就地显示 + 远程上传,铅酸蓄电池在线监测完整解决方案
运维·数据库