Java I/O API之性能分析 (下)

Java8 I/O源码-目录 从今天开始,就要开始学习I/O了。本专栏从将根据源码,详细深入地讲解Java I/O的实现。本专栏主要参考《Think In Java》一书,还有网上的一些技术文章。主要讲解Java I/O的源码、优缺点。个人能力有限,难免有考虑不到的地方,如果有哪里不准确,欢迎指出。本专栏参考的JDK版本为1.8。 阅读详情
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> 四、注册与处理过程详解   接下来我们要分析Connection的register()方法。前面我们总是说用Selector注册的连接,其实这是一种简化的说法。实际上,用Selector注册的是一个java.nio.channels.SocketChannel对象,但只针对特定的I/O操作。注册之后,有一个java.nio.channels.SelectionKey被返回。这个选择键可以通过attach()方法关联到任意对象。为了通过键获得连接,这里把Connection对象关联到键。这样,我们就可以从Selector间接地获得一个Connection。   public void register(Selector selector)   throws IOException {   key = socketChannel.register(selector, SelectionKey.OP_READ);   key.attach(this);   }   回过头来看ConnectionSelector。select()方法的返回值表示有多少连接已经做好了I/O操作的准备。如果返回值是0,则返回;否则,调用selectedKeys()获得键的集合(Set),从这些键获得以前关联的Connection对象,然后调用其readRequest()或writeResponse()方法,具体调用哪一个方法由连接被注册为读取操作还是写入操作决定。   现在再来看Connection类。Connection类代表着连接,处理所有协议有关的细节。在构造函数中,通过参数传入的SocketChannel被设置成非阻塞模式,这对于服务器来说是很重要的。另外,构造函数还设置了一些默认值,分配了缓冲区requestLineBuffer。由于分配直接缓冲区代价稍高,且这里的每一个连接都用一个新的缓冲区,因此这里使用java.nio.ByteBuffer.allocate()而不是ByteBuffer.allocateDirect()。如果重用缓冲区,直接缓冲区可能具有更高的效率。   public Connection(SocketChannel socketChannel)   throws IOException {   this.socketChannel = socketChannel;   ...   socketChannel.configureBlocking(false);   requestLineBuffer = ByteBuffer.allocate(512);   ...   }   完成所有初始化工作且SocketChannel做好了读取准备之后,ConnectionSelector调用了readRequest()方法,利用socketChannel.read(requestLineBuffer)方法把所有可用的数据读入缓冲区。如果不能读取完整的行,则返回发出调用的ConnectionSelector,允许另一个连接进入处理过程;反之,如果成功地读取了整个行,接下来应该做的是象在Httpd中一样解析请求。如果当前的请求合法,程序为请求目标文件创建一个java.nio.Channels.FileChannel,并调用prepareForResponse()方法。   private void prepareForResponse() throws IOException {   StringBuffer responseLine = new StringBuffer(128);   ...   responseLineBuffer = ByteBuffer.wrap(   responseLine.toString().getBytes("ASCII")   );   key.interestOps(SelectionKey.OP_WRITE);   key.selector().wakeup();   } prepareForResponse()方法构造出缓冲区responseLine以及(如果必要的话)应答头或错误信息,并把这些数据写入responseLineBuffer。这个ByteBuffer是一个byte数组的简单的封装器。生成待输出的数据之后,我们还要通知ConnectionSelector:从现在开始不再读取数据,而是要写入数据了。这个通知通过调用选择键的interestedOps(SelectionKey.OP_WRITE)方法完成。为了保证选择器能够迅速认识到连接操作状态的变化,接着还要调用wakeup()方法。接下来ConnectionSelector调用连接的writeResponse()方法。首先,responseLineBuffer被写入到Socket管道。如果缓冲区的内容全部被写入,而且还有被请求的文件需要发送,接着调用前面打开的FileChannel的transferTo()方法。transferTo()方法通常能够高效地把数据从文件传输到管道,但实际的传输效率依赖于底层的操作系统。任何时候,被传输的数据量至多相当于在无阻塞的情况下可写入目标管道的数据量。为安全和确保各个连接之间的公平起见,这里把上限设置成64 KB。   如果所有数据都已经传输完毕,close()执行清理工作。取消Connection的注册是这里的主要任务,具体通过调用键的cancel()方法完成。   public void close() {   ...   if (key != null) key.cancel();   ...   }   这个新的方案性能如何呢?答案是肯定的。从原理上看,一个Acceptor和一个ConnectionSelector足以支持任意数量的打开的连接。因此,新的实现方案在可伸缩性方面占有优势。但是,由于两个线程必须通过同步的queue()方法通信,它们可能互相阻塞对方。解决这个问题有两种途径:   ·改进实现队列的方法   ·采用多个Acceptor/ConnectionSelector对   与Httpd相比,NIOHttpd的一个缺点是,对于每一个请求,就有一个新的带缓冲的Connection对象被创建。这就导致了垃圾收集器产生的额外的CPU占用,这部分附加代价的具体程度又与VM的类型有关。然而,Sun不厌其烦地强调说,有了Hotspot,短期生存的对象不再成为问题。   五、可伸缩性的定量分析和比较   在可伸缩性方面,NIOHttpd到底比Httpd好多少?下面我们来看看具体的数字。首先要声明的是,这里的数字具有大量的推测成分,一些重要的环境因素,例如线程同步、上下文切换、换页、硬盘速度和缓冲等,都没有考虑到。首先评估处理r个并发的请求需要多少时间,假设被请求的文件大小是s字节,客户端的带宽是b字节/秒。对于Httpd,这个时间显然直接依赖于线程的数量t,因为同一时刻只能处理t个请求。所以Httpd的处理时间可以从公式一得到,其中c是执行请求分析之类操作的开销常量,这个值对于每一个请求来说都是一样的。另外,这里假定从磁盘读取数据的速度总是快于写入Socket的速度,服务器带宽总是大于客户机带宽之和,且CPU未满载。因此,服务器端的带宽、缓冲和硬盘速度等因素都不必在该公式中考虑。 然而,NIOHttpd的处理时间不再依赖于t。对于NIOHttpd,传输时间l在很大程度上依赖于客户端的带宽b、文件大小s以及前面提到的常数c。由此可以得出公式二,从该公式可以得到NIOHttpd的最小传输时间。 注意公式三的比值d,它度量了NIOHttpd和Httpd的性能对比关系。 进一步的分析表明,如果s、b、t和c是常数,r 趋向无穷时d的增长趋向于一个极限,从公式四可以方便地计算出这个极限。 因此,除了线程的数量和常量性的开销,连接的时长s/b对d具有极端重要的影响。连接持续的时间越长,d值越小,NIOHttpd对比Httpd的优势也就越高。表一显示出,当c=10ms,t=100,s=1mb,b=8kb/s时,NIOHttpd要比Httpd快126倍。如果连接持续了很长一段时间,NIOHttpd表现出巨大的优势。当连接时间较短时,例如在100 Mb的局域网内,如果文件较大,NIOHttpd表现出10%的优势;如果文件较小,优势不明显。
避坑指南:RK3588视频编码与SRT推流实战中,我遇到的5个典型问题及解决方案 本文深度解析RK3588平台视频编码与SRT推流实战中的五个典型问题,包括MIPI摄像头内存对齐、多线程数据传递、FFmpeg时间戳设置、SRT连接参数调优及系统资源监控。提供具体解决方案和优化技巧,帮助开发者高效实现实时视频网络传输。 阅读详情

相关推荐

视频生成工具本地部署完全指南:Seedance能装吗?有哪些开源替代?

本文系统介绍了视频生成模型的本地部署方案,分为三个部分:1)Seedance 2.0的混合部署模式,其开源组件可本地集成但核心功能需调用API;2)完全开源替代方案对比,包括LTX-2、Wan 2.1等模型的硬件需求与特点;3)详细部署指南,以ComfyUI+Wan 2.1为例,涵盖软件准备、模型整合、参数调优等步骤,并提供了显存优化和多GPU配置技巧。文章为需要离线视频生成能力的用户提供了完整技术路径。

小明的博客 1万+

Java I/O API之性能分析

 IO API的可伸缩性对Web应用有着极其重要的意义。Java 1.4版以前的API中,阻塞I/O令许多人失望。从J2SE 1.4版本开始,Java终于有了可伸缩的I/O API。本文分析并计算了新旧I/O API在可伸缩性方面的差异。 提纲: 一、概述二、用旧API编写的HTTP服务器三、非阻塞的HTTP服务器四、注册与处理过程详解五、可伸缩性的定量分析和比较 正文: 一、概述 IO API的

chnjxiang的专栏 956

CAD文件转换避坑指南:Inventor导出STP时这些设置千万别忽略

本文深入解析了使用Autodesk Inventor导出STP文件时的关键设置与避坑指南。重点探讨了应用协议选择、样条曲线拟合精度对几何保真度的影响,以及装配体结构和元数据的保全策略,旨在帮助用户实现高质量、零误差的CAD数据交付,避免下游软件打开时出现特征丢失或曲面破碎等问题。

weixin_29214559的博客 520

Java I/O API之性能分析 (上)

 IO API的可伸缩性对Web应用有着极其重要的意义。Java 1.4版以前的API中,阻塞I/O令许多人失望。从J2SE 1.4版本开始,Java终于有了可伸缩的I/O API。本文分析并计算了新旧I/O API在可伸缩性方面的差异。   一、概述   IO API的可伸缩性对Web应用有着极其重要的意义。Java 1.4版以前的API中,阻塞I/O令许多人失望。从J2SE 1.4版本开始,J

zaowei21的专栏 1702

华为HCIA-Datacom实战:200人企业园区网从规划到部署全流程解析

本文详细解析了华为HCIA-Datacom认证实战中200人企业园区网的规划与部署全流程。从需求分析、组网架构设计到设备选型、VLAN划分及安全策略实施,全面覆盖园区网建设的关键环节,特别针对部门隔离、无线覆盖和基础安全防护等典型场景提供可落地的解决方案。

f0g1h2的博客 715

2026 具身智能 VLA/WAM 全栈学习与训练路线:从动作建模、SFT、RL 到世界模型的 RTX PRO 6000 96GB 单卡实战指南

我会把这张表做成“”而不是只列论文名:先核对每个模型截至的公开代码、训练目标和数据接口,再单独给你一套。对于没有公开、只有推理代码或训练细节不完整的模型,我会明确标出来,避免把“论文里提到”误写成“可复现”。目前有一个重要更新:。截至今天 NVIDIA 官方开源主线已经是换成 Cosmos-Reason2-2B/Qwen3-VL 架构,动作端仍是连续路线,而且官方明确给出单卡微调时默认只训练,峰值显存约。所以你的 96GB 单卡对 GR00T SFT 非常宽裕。可以。下面我按,把它整理成一张真正面向“

u013250861的博客 448

java io 性能_Java I/O API之性能分析 (上)

摘要:IO API的可伸缩性对Web应用有着极其重要的意义。Java 1.4版以前的API中,阻塞I/O令许多人失望。从J2SE 1.4版本开始,Java终于有了可伸缩的I/O API。本文分析并计算了新旧I/O API在可伸缩性方面的差异。一、概述IO API的可伸缩性对Web应用有着极其重要的意义。Java 1.4版以前的API中,阻塞I/O令许多人失望。从J2SE 1.4版本开始,Java终...

weixin_42118056的博客 228

省一蓝桥杯嵌入式-09RTC实时时钟

RTC(Real-Time Clock)实时时钟,是一个独立的定时器RTC模块拥有一组连续的计数的计数器,在响应软件配置下,可提供时钟、日历、闹钟功能RTC能提供年月日时分秒等信息(可设置)在系统复位或从待机模式唤醒后,RTC的设置时间维持不变(这个我没实现,复位后时间也重置了,有能力的可以自己研究一下)持续时间跟踪:在主系统断电后或处于低功耗模式时,RTC仍继续工作,原理是有额外的电池为其供电(蓝桥杯板子没有这个备用电源,该功能无效。

qq_46392331的博客 1729

Java I/O API之性能分析 (上)(转)

IO API的可伸缩性对Web应用有着极其重要的意义。Java 1.4版以前的API中,阻塞I/O令许多人失望。从J2SE 1.4版本开始,Java终于有了可伸缩的I/O API。本文分析并计算了新旧I/O API在可伸缩性...

cqwf95925的博客 110

5分钟搞定!用L型匹配电路优化窄带天线性能(附Smith圆图实操)

本文针对窄带天线阻抗匹配难题,提供了一套5分钟快速解决方案。通过详解L型匹配电路的核心原理,并结合Smith圆图这一射频工程师的“瑞士军刀”,手把手指导如何选择拓扑、计算元件值并进行实际调试,旨在帮助硬件工程师高效优化天线性能,实现最大功率传输。

yyy34的博客 446

筑基篇第9节:CUDA内存管理API进阶

CUDA多维内存管理与零拷贝技术 本文介绍了CUDA中高效处理多维数据的内存管理技术。对于二维数据,使用cudaMallocPitch可确保内存对齐访问,提升75%的带宽利用率;三维数据则通过cudaMalloc3D实现切片对齐。配套的cudaMemcpy2D/3D函数能高效处理数据拷贝。此外,零拷贝内存技术允许内核直接访问主机内存,避免显存拷贝开销。这些技术对图像处理、科学计算等应用至关重要,能显著提升多维数据处理的性能。

PeterPan的博客 83

java aip 分析_Java I/O API之性能分析 (下)(转)

四、注册与处理过程详解接下来我们要分析Connection的register()方法。前面我们总是说用Selector注册的连接,其实这是一种简化的说法。实际上,用Selector注册的是一个java.nio.channels.SocketChannel对象,但只针对特定的I/O操作。注册之后,有一个java.nio.channels.SelectionKey被返回。这个选择键可以通过attach...

weixin_35212962的博客 122

机床联网系列总结

总结机床联网专栏,两个好用的工具介绍,以及后续提升的方法和建议。

若云流风的专栏 934

第十八章 Java I/O系统

文章目录1.目录列表器目录使用工具2.输入和输出InputStream类型OutputStream类型3.添加属性和有用的接口通过FilterInputStream从InputStream读取数据通过FileOutputStream向OutputStream写入4.Reader和Writer更改流的行为5.自我独立的类:RandomAccessFileRandomAccessFile方法存储和恢复数据读取随机访问文件6. I/O流的典型使用方式缓冲输入文件从内存输入格式化的内存输入基本的文件输出7.文件读写

小名同学 22万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Java中的I/O系统

Java 提供了两种主要的 I/O API:传统的java.io和新的java.nio。前者适用于简单的 I/O 操作,而后者则适用于高效和非阻塞的 I/O 操作。理解并合理使用这两种 API,可以大大提高程序的 I/O 性能和灵活性。

2402_83919997的博客 1885

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Java的I/O演进之路

一、I/O 基础入门 Java1.4之前的早期版本,对I/O的支持并不完善,开发人员在开发java高性能IO程序的时候,会面临一些巨大的挑战和困难,主要问题如下: 没有数据缓存区,IO性能存在问题 没有C或者C++的Channel概念,只有输入、输出流 同步阻塞式I/O通信(BIO),通常会让通讯线程长时间的阻塞服务端的响应 支持的字符集有限,硬件可移植性不好 在Java支持异步通讯之前的很长一段时间里,一直都是C/C++长期占据着高性能服务端程序开发的语言,Java的同步阻塞式I/O一直被人们锁所诟病

csdn5215的博客 8018

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

341. Java I/O API - 理解 Java I/O 主要概念

本文介绍了Java I/O API的核心概念,包括输入/输出操作的基本原理和主要实现方式。内容涵盖Java I/O的发展历程(Java I/O、NIO和NIO2),详细对比了传统File类与现代Path接口的差异及适用场景,并解析了字节流(InputStream/OutputStream)和字符流(Reader/Writer)两类核心抽象。通过具体代码示例演示了文件读取操作,强调根据数据类型选择合适流类型的重要性。文章指出,虽然File类仍可使用,但Java SE 7后推荐使用Path接口以获得更好的错误处

yaoxin521123的博客 492

Java的I/O历史

Java的I/O历史

AiFlutter的博客 1253

Java NIO编程理论基础篇——Java I/O的发展以及linux网络I/O模型

发展简述: Java在jdk1.4之前,Java对I/O的支持并不完善,开发人员会遇到许多问题,例如: 没有数据缓冲区,性能较低; 没有C或者C++中的Channel概念,通常 ...

sdr_zd的博客 5679

Java的I/O模型

不同的I/O模型由于线程模型、API等差别很大,所以用法的差异也非常大。

fengshi95的博客 908

Netty权威指南:Netty总结-Java I/O

Linux的内核将所有的外部设备都看做一个文件来操作,对一个文件的读写操作会调用内核提供的系统提供的系统命令,返回一个file descriptor(fd,文件描述符)。核心是异步通道(Asynchronous Channel),异步通道不会阻塞线程,I/O操作会立即返回,当当I/O操作完成时,系统会自动调用与之关联的CompletionHandler,或通过Future对象通知操作的完成。NIO不能称为异步非阻塞I/O,只能称为非阻塞I/O,是基于I/O复用技术的非阻塞I/O。

Oceáno的博客 1514
上一篇: Java Web Start 实践
下一篇: 如何迅速成为Java高手
java169
博客等级 码龄19年 27粉丝 2568原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值