`
killer2008
  • 浏览: 8445 次
  • 性别: Icon_minigender_1
  • 来自: 成都
最近访客 更多访客>>
社区版块
存档分类
最新评论

关于JAVA NIO一些体验

阅读更多

1.NIO最大的变化是把服务端和客户端抽像统一起来,用一个Selector来检测事件。但把服务端与客户端分开来做系统的难度会小些,性能也会高些(因为代码里少了检查是服务端还是客户端的部分)。
2.ServerSocketChannel只支持OP_ACCEPT,SocketChannel支持OP_WRITE、OP_READ、OP_CONNECT事件
3.一个ListenThread与一个Selector一一对应,Selector的select方法是对事件进行轮询,3000个连接大概要耗时20ms(这个是我自己的电脑上测试的结果,比较普通的配置),因此一个selector负责的连接最好不要太多。
4.SocketChannel的register方法会与Selecotr.selector(timeout)相互阻塞,因此最好把所有注册事件和注册变更事件放到selector线程中来执行。
5.同时把所有Accept事件放到selector线程中来处理,这样可以避免线程间的切换,减少连接延时。
6.每次有select事件上来后,先把所有ready事件从interest集中去掉,否则多线程处理时,同样的事件会报多次上来。
7.注意ServerSocketChannel注册的事件必须有OP_ACCEPT,否则下次有SOCKET连接不上,而客户端的OP_CONNECT只是开始注册一次,在检测一次后不需再重新注册OP_CONNECT事件,如果再次重新注册OP_CONNECT事件后会造成Selector.selector(timerout)阻塞不了,一直不停地循环。
8.SocketChannel.open()每次打开一个新的SocketChannel,同理每次Selector.open()也打开一个新的Selector。
9.把所有的OP_ACCEPT事件和修改interest事件交由Selector线程来处理,这样可以避免同步和阻塞,提高性能。
10.windows与linux的线程处理与网络处理还是有很大区别。经测试windows XP适合作客户端(注意缺省情况下,Windows 为匿名(临时)端口保留端口号 1024 到 5000,超出这个数量时就会报no buffer异常 ),如果拿来做服务端,客户端会报大量的connect refuse。而linux2.6的网络处理较好(不管是客户端还是服务端),经测试在CPU2.8G、MEM512M的机子上能轻松处理几万个连接(如果报Too many files open,可能系统设置有关,可通过ulimit -HSn 50000[每个进程能打开的句柄数]来和echo 100000 >/proc/sys/fs/file-max[系统能打开的最大文件句柄数]来设置)。不知道windows2003做为服务器时的性能怎么样。
11.JDK1.4的NIO并不等于AIO,只是在某个调上模拟异步,性能没有AIO好(网上有人说AIO比Epoll高,也有说相反的,这个本人未验证)。AIO的实现有IBM的AIO(windows上采用的是IOCP,linux2.6上采用的AIO)。(性能没有经验证)
12.windows上的socket收发缓存可以随便设置,但linux2.6上最小只能到1024byte(调整内核参数应该可以更改)。
13.JDK1.5update09与jdk6在linux上采用的是epoll,比之前的性能有明显的提高(能处理更多的连接,在短时间内大量连接时会报更少的错误)
14.当连接数太多时,检查连接超时也是个很大问题(每次select后再检查时间截也许是个比较好的办法)。
15.用视图缓冲区比每个连接用一个缓冲要好。(Grizzly的做法是系统有一个大的缓存区4000000Byte,然后每个线程在上面分割一个ByteBuffer)

分享到:
评论

相关推荐

    基于Java NIO实现五子棋游戏.zip

    在"基于Java NIO实现五子棋游戏.zip"这个项目中,开发者可能利用NIO的非阻塞特性来处理玩家的输入和游戏状态的更新,使得游戏体验更加流畅。五子棋游戏通常涉及两个玩家轮流在棋盘上下棋,因此需要实时处理两个玩家...

    基于nio的简易聊天室

    总的来说,"基于nio的简易聊天室"项目综合运用了Java NIO的多种核心特性,通过通道、缓冲区和选择器实现了高效的网络通信,同时结合GUI提供了友好的用户体验。通过这个项目,开发者可以深入理解NIO在实际应用中的...

    java-NIO-demo

    Java NIO(Non-blocking Input/Output)是一种在Java中处理I/O操作的新方式,相比于传统的BIO( Blocking I/O),NIO提供了更高效的数据传输能力,尤其在处理大量并发连接时。NIO的核心概念包括通道(Channels)、...

    JavaNIO内存文件系统ParallelGit.zip

    ParallelGit 可以帮助你操作本地 Git仓库,允许你通过 Java 7 nio 文件系统接口来访问 Git 仓库,达到跟原生文件系统一样的体验。示例Create Repositorypublic Repository createProjectRepository() {  File ...

    自己封装的IO核NIO

    总的来说,"自己封装的IO核NIO"项目通过封装Java的IO和NIO,提供了更高效、易用的网络通信工具,特别是对于需要频繁与服务器交互的应用,如微信开发,能显著提升开发体验。而其中的HTTP客户端则进一步简化了HTTP请求...

    Android开发进阶之NIO非阻塞包

    对于一些高级操作,例如通过PC控制手机重启,则需要更多的权限,通常需要Root权限才能执行。 ```java public static void reboot(String into, InetSocketAddress adbSockAddr, Device device) { // 实现代码... }...

    Tricks and Tips With NIO Using the Grizzly Framework

    接下来,我们会简单介绍Java NIO包的基础知识,并呈现我们在实施Project Grizzly时所学到的一些高效使用Java NIO的技术和策略。 #### Java NIO概述 Java NIO (New I/O) 是Java SE 1.4版本引入的一个新特性,它提供...

    java线程与并行(主要讲解java的nio包某些内容)

    ### Java线程与并行详解 #### 一、Java线程基础 在Java中,**线程**是一种轻量级的进程,它允许一个程序同时执行多个任务,从而提高程序的执行效率。...在实际开发中,合理利用线程能够显著提升程序性能和用户体验。

    bio nio aio demo

    在"bio nio aio demo"项目中,我们可以通过运行`main`方法来体验这三种模型的不同之处。这个示例可能会包含三个部分:BIO服务器、NIO服务器和AIO服务器。每部分都会展示如何创建服务器、接收客户端连接、处理请求和...

    深入体验Java项目开发源代码

    在深入体验Java项目开发的源代码中,我们可以找到一系列关于Java编程和项目实施的实践示例。这本书的目的是为了帮助读者不仅仅是理解Java语言的基础,更深入地了解如何将这些知识应用到实际项目中。源代码提供了丰富...

    java swing拷贝文件进度条

    Java提供了一个名为`java.nio.file.Files`的类,它包含了一些静态方法,如`copy()`,可以用来拷贝文件。以下是一个简单的文件拷贝示例: ```java import java.nio.file.Files; import java.nio.file.Path; import ...

    基于事件的_NIO_多线程服务器

    在Java的网络编程中,NIO(Non-blocking I/O)作为一种高效的数据处理模式,自JDK 1.4版本引入以来,逐渐成为了开发高性能网络应用的重要工具之一。与传统的阻塞I/O相比,NIO通过非阻塞的方式减少了线程的开销,特别...

    Core java 6 2

    5. **改进的I/O**:NIO.2(New I/O 2)或Java 7的`java.nio.file`包在Java 6中开始预览,提供了一种新的文件系统接口,支持异步I/O操作。 6. **改进的XML处理**:Java 6加强了XML处理,包括SAX和DOM解析器的性能...

    一些java常用的工具类

    Java是一种广泛使用的编程语言,其灵活性和..."一些java常用的工具类"可能涵盖了上述的多种功能,为开发者提供了方便快捷的编程体验。通过理解和利用这些工具类,开发者可以更专注于业务逻辑,而不是重复的基础操作。

    nio.file:java.nio.file 的 Clojure 包装器

    nio.file java.nio.file 的 Clojure 包装器为什么要这样做? 看看 。 工作正在进行中! 在我们达到 1.0.0 之前,预计会有错误和缺失的功能。支持的 Clojure 和 Java 版本nio.file针对 Clojure nio.file和 Java 1.7+...

    java程序员必备电子书

    5. **Java NIO**:非阻塞I/O(New I/O)是Java 1.4引入的新特性,讲解了如何提高I/O性能,尤其适用于高并发场景。 6. **Java Concurrency in Practice**:讨论Java多线程编程的最佳实践,对于理解和解决并发问题至...

    java SocketChannel通信实例

    本实例着重讲解如何利用Java NIO(Non-blocking Input/Output,非阻塞输入/输出)中的SocketChannel进行非阻塞通信。 非阻塞通信是一种高效的数据传输方式,它允许线程在等待数据时不会被挂起,而是可以执行其他...

    Java虚拟机规范(Java SE 7 中文版

    11. 其他改进:如改进的异常处理、垃圾收集算法优化、JMX改进等,都是Java SE 7中提升JVM性能和开发者体验的重要方面。 为了深入理解这些概念,可以参考压缩包中的"Java虚拟机规范 (Java SE 7 中文版).pdf"文档,它...

    Java 图片压缩

    至于下载和修改图片路径,Java的标准库没有提供直接的下载功能,但我们可以借助第三方库如Apache HttpClient或者使用Java的`java.net.URL`和`java.nio`包来实现。修改图片路径则相对简单,只需将图片文件移动到新的...

Global site tag (gtag.js) - Google Analytics