`
wupuyuan
  • 浏览: 77383 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java之nio学习

阅读更多

    刚刚开始接触nio的时候有点迷惑,在网上也看过很多资料,大多都是讲了怎么用,没有个系统介绍。于是就花了点时间看看。

    1、nio是java传统网络IO的升级版,nio和io的关系可以看成http协议和tcp/ip协议(升级版)
    2、nio相比于io,是更精准的传输协议。具体的下面再说。

    然后说说nio和io的比较
    io传输直接是读取byte数组,由此产生的阻塞,缓冲区的额外开销等等问题在nio上没有的,原因如下:
    首先看看nio的传输单元:java.nio包下的ByteBuffer,ShortBuffer,FloatBuffer,IntBuffer,DoubleBuffer,LongBuffer,它们都继承于Buffer,
    Buffer含有4个属性,

private int mark = -1;
private int position = 0;
private int limit;
private int capacity;

    由此可见,在传输的时候,就标注好了每个传输单元的长度/容量等一系列信息,自然在接受一端无需缓冲区了,很类似http的格式,增加了报文头等),解决网络io长久以来的缓冲区的各种问题。

    网络传输阻塞问题在nio的解决。
    原有io在socket传输时一旦信息传送停止,等待接收的线程就会一直等待直到超时异常抛出。
    nio中采用的是基于事件驱动的事件-触发的模式来避免了阻塞,或者说是反应器设计模式(可能有的人也觉得是观察者模式,的确很类似:当被被观察体改变时,所有相关的依属体都得到通知,不过观察者只限于单个事件,反应器是与多公个事件源关联)。
    nio的非阻塞机制由Channel 类和Selector 类来完成,Selector是Channel的多路复用器,Channel官方解释为服务端和客户端的一种通信机制,每个 Channel 向 Selector 注册事件。当事件从客户机处到来时, Selector 将它们多路分用并将这些事件分派到相应的 Channel 。乍一看上去就是不是很熟悉?没错,很类似Socket = SocketServer.accpet(),然后分配一个新线程给对应的Socket,但是这里的Channel仅仅是作为信息传输,不能加入额外的逻辑处理。
    相比于传统的网络IO,不需要用户自定义Thread来负责和客户端交互信息,只需要处理业务逻辑。

    以网络传输来说,运行步骤如下
    1、Channel向Selector注册
    2、有请求则Selector分配Channel进行信息传输(按照Buffer的“协议”),如果某个线程在一个Channel的I/O上阻塞时,另一个线程可以关闭这个Channel(实际物理传输层的上阻塞是不可避免的)。
    3、当某个Channel信息接受完整后,接受到的信息提交给用户自定义的处理模块完成业务处理,返回信息由这个Channel写回去

    最后说说我认为的nio的缺点(缺点仔细想想也谈不上,主要是需要注意地方),由于加入Buffer格式,对于旧有的系统和非java.nio的系统来说,得有额外的支持。

 

分享到:
评论
5 楼 cwj158 2012-03-02  
分析真到位哈。值得学习
4 楼 wupuyuan 2011-08-26  
xieyuNL 写道
wupuyuan 写道
xieyuNL 写道
咦,刚才回复怎么不见了?呵呵,不知道eye的回复还有啥机制还有啥流程么?

总之,不错不错,要顶一顶啦!

javaNIO不得不说是高性能服务器的解决方案之一,不过在其他的技术中这个东西的基本思想应该早就存在,java也是从jdk1.4开始有这个,现在已经有版本2了,有名的mina架构也是在这个基础上完成的,当然不仅仅局限于它了;但是它也有自己的应用场景,有些还是不适合用NIO来解决问题,所以希望有缺陷和一些测试场景等等吧;

说到javaNIO就不得不说下他的线程啥的,说到线程应该就不得不说扯点CPU级别的上下文切换的内容,如果将这部分内容说得很爽的话,觉得就更加完美啦。


现在在这里是只卖国外的产品,本地部门不研发新的产品,和开始的信息很不相符,所以测试场景基本没有(尤其是高性能方面的),只能“纸上谈兵”了,搞的我很郁闷 后悔当时没去淘宝了。
另外的新的技术大多是新设计模式的演化,JVM底层已经很成熟了。jdk1.7的变化不算很大。继续研究吧。呵呵


其实就JVM底层也在不断的演变中,跨越比较大的应该是1.0向1.1跨越,然后是1.5向1.6进行跨越的内核变化,对于内核的变化越来越多,因为对于各类需求的变化以及各种各样的硬件支撑的,Hotspot是开源版本的JVM,不过类似JRockit、IBM的jdk以及一些其他的等都有很多自己的实现思路,对于开源的Hotspot来讲1.7另很多公司所期待的是它对超大内存的管理(当然还有很多其他的改进,比如增加了很多指令来处理动态代码的性能),尤其是对超大内存的回收时间,虽然在1.6中的CMS GC已经有所进展但是做得还不够(经单个JVM对96G内存Full GC回收采用CMS GC大概是200ms,而采用原有的并行GC需要的是一百多秒,CPU是16个4核心的),不过我们希望的是几十毫秒搞定甚至于可以承载更大的内存空间,所以在世纪初期提出的G1的概念一直到1.7得到了印证,也是一直被大家所期盼的,按照早期论文的说法,一个JVM管理超大的内存回收的等待响应时间不再是什么问题。

呵呵,我关注的没有你这么多,我比较偏向算法或者是设计思想,比如GC开始由计数回收到现在的复制回收火车回收等等。现在大多的改进都是基于硬件的提升对应的优化。现在在写关于锁的东西,==你也来拍砖吧!
3 楼 xieyuNL 2011-08-26  
wupuyuan 写道
xieyuNL 写道
咦,刚才回复怎么不见了?呵呵,不知道eye的回复还有啥机制还有啥流程么?

总之,不错不错,要顶一顶啦!

javaNIO不得不说是高性能服务器的解决方案之一,不过在其他的技术中这个东西的基本思想应该早就存在,java也是从jdk1.4开始有这个,现在已经有版本2了,有名的mina架构也是在这个基础上完成的,当然不仅仅局限于它了;但是它也有自己的应用场景,有些还是不适合用NIO来解决问题,所以希望有缺陷和一些测试场景等等吧;

说到javaNIO就不得不说下他的线程啥的,说到线程应该就不得不说扯点CPU级别的上下文切换的内容,如果将这部分内容说得很爽的话,觉得就更加完美啦。


现在在这里是只卖国外的产品,本地部门不研发新的产品,和开始的信息很不相符,所以测试场景基本没有(尤其是高性能方面的),只能“纸上谈兵”了,搞的我很郁闷 后悔当时没去淘宝了。
另外的新的技术大多是新设计模式的演化,JVM底层已经很成熟了。jdk1.7的变化不算很大。继续研究吧。呵呵


其实就JVM底层也在不断的演变中,跨越比较大的应该是1.0向1.1跨越,然后是1.5向1.6进行跨越的内核变化,对于内核的变化越来越多,因为对于各类需求的变化以及各种各样的硬件支撑的,Hotspot是开源版本的JVM,不过类似JRockit、IBM的jdk以及一些其他的等都有很多自己的实现思路,对于开源的Hotspot来讲1.7另很多公司所期待的是它对超大内存的管理(当然还有很多其他的改进,比如增加了很多指令来处理动态代码的性能),尤其是对超大内存的回收时间,虽然在1.6中的CMS GC已经有所进展但是做得还不够(经单个JVM对96G内存Full GC回收采用CMS GC大概是200ms,而采用原有的并行GC需要的是一百多秒,CPU是16个4核心的),不过我们希望的是几十毫秒搞定甚至于可以承载更大的内存空间,所以在世纪初期提出的G1的概念一直到1.7得到了印证,也是一直被大家所期盼的,按照早期论文的说法,一个JVM管理超大的内存回收的等待响应时间不再是什么问题。
2 楼 wupuyuan 2011-08-26  
xieyuNL 写道
咦,刚才回复怎么不见了?呵呵,不知道eye的回复还有啥机制还有啥流程么?

总之,不错不错,要顶一顶啦!

javaNIO不得不说是高性能服务器的解决方案之一,不过在其他的技术中这个东西的基本思想应该早就存在,java也是从jdk1.4开始有这个,现在已经有版本2了,有名的mina架构也是在这个基础上完成的,当然不仅仅局限于它了;但是它也有自己的应用场景,有些还是不适合用NIO来解决问题,所以希望有缺陷和一些测试场景等等吧;

说到javaNIO就不得不说下他的线程啥的,说到线程应该就不得不说扯点CPU级别的上下文切换的内容,如果将这部分内容说得很爽的话,觉得就更加完美啦。


现在在这里是只卖国外的产品,本地部门不研发新的产品,和开始的信息很不相符,所以测试场景基本没有(尤其是高性能方面的),只能“纸上谈兵”了,搞的我很郁闷 后悔当时没去淘宝了。
另外的新的技术大多是新设计模式的演化,JVM底层已经很成熟了。jdk1.7的变化不算很大。继续研究吧。呵呵
1 楼 xieyuNL 2011-08-25  
咦,刚才回复怎么不见了?呵呵,不知道eye的回复还有啥机制还有啥流程么?

总之,不错不错,要顶一顶啦!

javaNIO不得不说是高性能服务器的解决方案之一,不过在其他的技术中这个东西的基本思想应该早就存在,java也是从jdk1.4开始有这个,现在已经有版本2了,有名的mina架构也是在这个基础上完成的,当然不仅仅局限于它了;但是它也有自己的应用场景,有些还是不适合用NIO来解决问题,所以希望有缺陷和一些测试场景等等吧;

说到javaNIO就不得不说下他的线程啥的,说到线程应该就不得不说扯点CPU级别的上下文切换的内容,如果将这部分内容说得很爽的话,觉得就更加完美啦。

相关推荐

    Java.NIO资源下载资源下载

    根据提供的文件信息,我们可以提取并总结出关于Java NIO(New Input/Output)的重要知识点。...通过本书的学习,开发者可以全面掌握 Java NIO 的各种特性和技巧,从而写出更加高效可靠的 Java 代码。

    JAVA NIO 学习资料

    Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java从JDK 1.4版本开始引入的一种新的IO模型,它为Java应用程序提供了更高效的数据传输方式,尤其适用于高并发、大数据量的网络服务。与传统的IO...

    JAVA NIO学习网站

    在《JAVA NIO学习网站》的博文中,作者可能详细讲解了如何使用这些组件以及它们之间的交互。例如,可能会介绍如何创建并配置通道,如何使用缓冲区读写数据,如何注册通道到选择器,以及如何利用选择器处理多个并发...

    Java NIO 中文 Java NIO 中文 Java NIO 中文文档

    Java NIO 深入探讨了 1.4 版的 I/O 新特性,并告诉您如何使用这些特性来极大地提升您所写的 Java 代码的执行效率。这本小册子就程序员所面临的有代表性的 I/O 问题作了详尽阐述,并讲解了 如何才能充分利用新的 I/O ...

    Java NIO英文高清原版

    Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java平台中用于替代标准I/O(BIO)模型的一种新机制。...学习和理解Java NIO以及Netty的使用,对于提升Java网络编程的能力至关重要。

    Java NIO学习资料+代码.zip

    Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java在JDK 1.4版本引入的一种新的I/O模型,它为Java开发者提供了更高效、...学习和掌握Java NIO,能够帮助开发者编写出更高效、更易维护的网络程序。

    java nio入门学习,两个pdf

    Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java标准库提供的一种替代传统I/O模型的新技术。在Java 1.4版本中引入,NIO提供了一种全新的I/O编程方式,使得Java开发者能够更高效地处理I/O操作...

    JAVA_NIO学习总结

    ### JAVA_NIO学习总结 #### 重要知识点概览 JAVA_NIO(Non-blocking I/O,非阻塞I/O)是Java平台中用于替代传统IO(Blocking IO)的一种高性能IO处理模型,首次出现在JDK 1.4中。NIO通过引入通道(Channel)和缓冲区...

    nio.rar_NIO_NIO-socket_java nio_java 实例_java.nio

    通过这个实例,开发者可以学习如何设置NIO服务器,如何处理多个并发连接,并了解NIO如何提高服务器的吞吐量和响应性。NIO适用于需要处理大量并发连接的场景,例如聊天服务器、游戏服务器等。理解并掌握Java NIO的...

    Java NIO 中英文版 + Pro Java 7 NIO.2

    Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java平台中用于高效处理I/O操作的重要框架。...通过学习这两部分的内容,开发者可以更好地理解和利用Java平台提供的I/O能力,优化应用程序的性能。

    Pro Java 7 NIO2

    通过对《Pro Java 7 NIO2》中Path类的学习,我们可以看到NIO.2 API为Java开发者提供了强大而灵活的文件系统操作工具。从简单的路径构建到复杂的文件属性访问,Path类及其相关API为Java程序提供了处理文件和目录的...

    java-nio.rar_NIO_java nio

    Java NIO,全称为New Input/Output,是Java在1.4版本引入的一个新特性,是对传统的I/O模型的一种改进。...通过阅读"java-nio.pdf"这份文档,你将能够深入学习Java NIO技术及其在异步连接池中的应用。

    Java.nio

    开发者可以通过学习和掌握Java.nio,优化自己的应用程序,特别是网络通信和文件操作相关的部分。而压缩包中的"thread"、"noblock"、"block"可能分别对应于线程管理、非阻塞I/O和阻塞I/O的相关示例或讨论,进一步深入...

    java NIO实例

    Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java从1.4版本开始引入的一种新的I/O模型,它为Java应用程序提供了更高效的数据传输...学习和理解NIO,对于开发高并发、高性能的Java应用至关重要。

    java NIO技巧及原理

    Java NIO(New Input/Output)是Java标准库提供的一种I/O模型,它与传统的 Blocking I/O(IO)相比,提供了更加高效的数据传输方式。在Java NIO中,"新...学习和掌握NIO,对于提升Java应用的性能和扩展性至关重要。

Global site tag (gtag.js) - Google Analytics