java nio web,java.nio对Web服务器有什么好处?

我真的很喜欢Paul Tyma关于这个问题的文章,它真的很深入.我在他的文章中看到两个要点:

>使用传统的阻塞IO可以获得更好的吞吐量(他测量过)

>传统的,阻塞IO使您的服务器逻辑方式变得不那么复杂 – 客户端 – 服务器对话的状态在线程流中隐式定义.

使用非阻塞NIO的主要原因是当您有多个同时的空闲请求时.原因是:使用NIO,您可以从同一个线程提供多个请求,这样做会更好.

好的,这是你可以随处阅读的内容.现在……为什么这样更好?

有两个主要原因,它们与每个线程带来的两种不同类型的开销有关:

>当调度程序更改处理器正在执行的线程时,会出现“上下文切换”,这可能是一项昂贵的操作(即,线程在处理器中有一些状态 – 寄存器中的值,L1中加载的大量数据, L2,L3缓存等 – 当线程停止时必须“保存”某个地方,并在线程继续执行时“重新加载”;同样,当你丢失L1,L2,L3缓存的内容时,你可能会得到吨数缓存未命中,可能是坏的(或不是,取决于工作量))

>每个线程必须分配自己的独立堆栈(通常用于存储局部变量并返回函数调用的地址)

因此,每个线程都带有一些更“浪费”的内存和可能“浪费”的处理器周期(以执行“上下文切换”).

现在,假设您有一个聊天服务器,客户端建立HTTP连接请求新消息,并且只有当有新消息发送到该客户端时,您的服务器才会回答它们(以便客户端立即接收新消息).假设您有10k这样的客户端.在传统的,阻塞的,每个连接的线程模型中,你有10k个线程.在Java中,线程堆栈大小(-Xss)的典型标准值是256kb.使用10k线程,您将自动使用大约2GB的内存!!!!!!!!更糟糕的是:即使聊天服务器上根本没有任何活动,也没有发送任何消息,客户端仍然会浪费那些2GB.添加大量的上下文切换,您会发现问题.

在这种情况下,你最好使用非阻塞NIO,其中较少的线程(最终只有1!)足以处理所有10k客户端,因此你将保存上下文切换(即cpu时间)和线程堆栈(即内存),即使以更复杂的代码为代价,这通常是使用非阻塞NIO的副作用.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值