Java I/O API 之性能分析 (上)
出处:CSDN
[ 2004-12-13 10:06:59 ]
作者:legendinfo
责任编辑:huangpeidan
·想拿 A75 相机,现在就进
来答题
·全球独家首测 RV410
·论坛网友召集 A95 团购
·视窗专区常见问题汇总
·一周摄影作品汇总投票
·论坛篮球赛,火热报名进行
中
·想拿 A75 相机,现在就进
来答题
·全球独家首测 RV410
·论坛网友召集 A95 团购
·视窗专区常见问题汇总
·一周摄影作品汇总投票
·论坛篮球赛,火热报名进行
中
·想拿 A75 相机,现在就进
来答题
·全球独家首测 RV410
·论坛网友召集 A95 团购
·视窗专区常见问题汇总
·一周摄影作品汇总投票
·论坛篮球赛,火热报名进行
中
摘要:
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 终于有了可伸缩的 I/O API。本文分析并计算了新旧 IO API 在可
伸缩性方面的差异。Java 向 Socket 写入数据时必须调用关联的 OutputStream 的 write()方法。只有当所
有的数据全部写入时,write()方法调用才会返回。倘若发送缓冲区已满且连接速度很低,这个调用可
能需要一段时间才能完成。如果程序只使用单一的线程,其他连接就必须等待,即使那些连接已经做
好了调用 write()的准备也一样。为了解决这个问题,你必须把每一个 Socket 和一个线程关联起来;采
用这种方法之后,当一个线程由于 I/O 相关的任务被阻塞时,另一个线程仍旧能够运行。
尽管线程的开销不如进程那么大,但是,考虑到底层的操作平台,线程和进程都属于消耗大量资
源的程序结构。每一个线程都要占用一定数量的内存,而且除此之外,多个线程还意味着线程上下文
的切换,而这种切换也需要昂贵的资源开销。因此,Java 需要一个新的 API 来分离 Socket 与线程之间
过于紧密的联系。在新的 Java I/O API(java.nio.*)中,这个目标终于实现了。