`
OpenMind
  • 浏览: 179796 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

netty做Pipe一端快一端慢时防止内存溢出进行的操作

阅读更多

前段时间用netty3.x做了一个pipe的功能,读的速度很快,写的速度很慢,结果读总是把内存耗光(来不及写写到pipe的另一端),后面解决了这个问题。

原来的pipe的代码:

	public void messageReceived(ChannelHandlerContext ctx, MessageEvent e)
			throws Exception {
		inboundChannel.write(e.getMessage());
	}

 inboundChannel是一个很慢的连接,而当前连接很快(messageReceived调用很频繁),inboundChannel的写缓冲区很快满了(inboundChannel.isWritable() =false),继续写很容易就OOM了,

 

修改后的代码是:

 

private Object trafficLock = new Object();
	public void messageReceived(ChannelHandlerContext ctx, MessageEvent e)
			throws Exception {
		synchronized (trafficLock) {
            inboundChannel.write(e.getMessage());
            if (!inboundChannel.isWritable()) {
                e.getChannel().setReadable(false);
            }
        }
	}

	@Override
	public void channelInterestChanged(ChannelHandlerContext ctx,
			ChannelStateEvent e) throws Exception {
		synchronized (trafficLock) {
			if (e.getChannel().isWritable()) {
				inboundChannel.setReadable(true);
			}
		}
	}

 

 必须给双方的channel都添加包含上述代码的handler,才能生效;

上面的代码可以理解成:

1,如果对方channel不可写时,把当前channel的读操作禁用;

2,如果当前的channel可写了,把对方channel的读操作启用;

 

两个handler是对等的,恰好可以解决这个问题。

 

注意:两个handler必须共享锁trafficLock,具体原因,参见讨论:

http://markmail.org/message/x7jc6mqx6ripynqf

以及另外一个实例:

http://searchco.de/codesearch/view/16958454

 

0
2
分享到:
评论

相关推荐

    springboot整合 netty做心跳检测

    springboot整合 netty做心跳检测 springboot整合 netty做心跳检测 springboot整合 netty做心跳检测 springboot整合 netty做心跳检测 springboot整合 netty做心跳检测 springboot整合 netty做心跳检测 springboot整合...

    Netty 快速入门系列-源码

    Netty是一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。 Netty是一个NIO客户端、服务端框架。允许快速简单的开发网络应用程序。...

    深入浅出Netty_netty_

    它支持预读和后写,可以在不复制数据的情况下进行读写操作,从而提高了性能。 书中的代码案例会涵盖如何创建服务器、建立连接、处理各种网络事件,如连接建立、数据接收、连接关闭等。还会介绍如何定义自定义的编码...

    使用netty进行rtsp服务端开发.zip

    它允许客户端向服务器请求播放、暂停、快进等操作,从而实现对远程媒体源的交互式控制。 2. Netty与RTSP服务器: 使用Netty构建RTSP服务器的优势在于其高度可定制性和高并发能力。Netty的NIO(非阻塞I/O)模型使得...

    用netty实现文件传输

    总结,利用 Netty 实现文件传输是一个涉及网络编程、多线程、I/O 操作以及内存管理的综合实践。通过 Netty 的强大功能,我们可以构建高效、可靠的文件传输系统。在实际应用中,还需要考虑到性能优化、安全性以及异常...

    Netty实战 电子版.pdf_java_netty_服务器_

    3. **ByteBuf**:Netty提供了自己的ByteBuf类,作为缓冲区,它比Java的ByteBuffer更易用且高效,支持直接内存和堆内存操作,避免了频繁的内存复制。 4. **零拷贝**:Netty通过使用FileRegion实现零拷贝,减少了CPU...

    Netty 教程 Netty权威指南

    2. **ByteBuf**:Netty 提供了 ByteBuf 作为缓冲区,相比传统的 ByteBuffer 更加高效,支持零拷贝,方便进行数据读写操作。 3. **ChannelHandler**:这是 Netty 中的核心组件,负责处理网络事件,如连接、读写、...

    netty做服务端支持ssl协议实现websocket的wss协议(java)

    在IT行业中,Netty是一个非常流行的高性能、异步事件驱动的网络应用框架,主要用于快速开发可维护的高性能协议服务器和客户端。在这个场景中,我们关注的是如何使用Netty来实现服务端支持SSL协议,以便实现WebSocket...

    基于netty封装的快速分布式任务开发框架

    【基于Netty封装的快速分布式任务开发框架】是一种高效、轻量级的解决方案,它将Netty的强大功能与分布式任务处理的灵活性相结合。Netty是一个高性能的异步事件驱动的网络应用程序框架,常用于构建高度可扩展的网络...

    Netty实战.epub_netty实战epub_netty实战epub_netty_

    《Netty实战》这本书是针对Java网络编程框架Netty的一本深入实践教程,旨在帮助读者掌握Netty的核心特性和实际应用。Netty是一款高性能、异步事件驱动的网络应用程序框架,广泛应用于各种分布式系统、微服务架构以及...

    Netty-API-文档中文版

    例如,使用FileRegion进行大文件传输时,可以直接将文件通道的数据发送到网络,而无需先读入到缓冲区。 3. **丰富的协议支持**:Netty 提供了对多种网络协议的支持,包括TCP、UDP、HTTP、WebSocket、FTP等,还支持...

    netty-netty-4.1.19.Final.zip_netty_netty学习_rocketmq

    在Netty中,EventLoop(事件循环)负责处理I/O事件,而Channel(通道)则代表网络连接,它们是进行数据传输的基础。ChannelHandler(通道处理器)是业务逻辑的载体,通过ChannelPipeline(通道管道)组织成处理链,...

    最新netty中文文档chm版

    这个“最新Netty中文文档CHM版”为中国的开发者提供了一个方便的中文学习资源,解决了阅读英文原版文档时的语言障碍,使学习过程更为轻松。 Netty 的核心特性包括: 1. **高性能**: Netty 使用了Java NIO(非阻塞I...

    整合netty实时通讯

    - Netty 的 ByteBuf 提供了高效的内存管理,避免了频繁的字节数组拷贝。 2. **WebSocket 协议** - WebSocket 协议通过 HTTP/HTTPS 协议握手建立连接,之后即可在连接上进行双向数据传输,无需重复的 HTTP 请求/...

    netty4.0源码,netty例子,netty api文档

    Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。这个压缩包包含的是Netty 4.0.0.CR3版本的相关资源,包括源码、示例以及API文档,对于学习和理解Netty的工作...

    netty_learn_netty_源码.zip

    这个压缩包“netty_learn_netty_源码.zip”显然包含了Netty框架的源代码,这对于深入理解Netty的工作原理、优化网络应用或者进行二次开发非常有帮助。下面将详细探讨Netty的一些核心概念和关键组件。 1. **NIO (非...

    Netty服务器与客户端

    2. **零拷贝**:Netty支持零拷贝技术,减少了数据在内存中的复制次数,提高了系统效率。 3. **丰富的组件库**:Netty提供了大量预定义的协议解码器和编码器,简化了网络编程的复杂性。 4. **线程模型**:Netty的...

    netty快速入门教程9集 共12集

    10. **最佳实践**:学习Netty的最佳实践,包括如何编写可重用的代码、如何进行测试,以及如何避免常见的陷阱和误区。 通过这个全面的教程,你不仅可以掌握Netty的基础知识,还能深入了解其高级特性和实战技巧,为你...

    Netty进阶之路-跟着案例学Netty

    此外,Netty的ByteBuf类是高效内存管理的关键,它提供了缓冲区的读写操作,避免了不必要的数据拷贝。 在高级特性部分,书籍会涉及Netty的编解码器,如LineBasedFrameDecoder用于处理以换行符分隔的协议,以及...

    《Netty 实战》源码

    ByteBuf相比Java的ByteBuffer,提供了更丰富的API,避免了直接操作原始缓冲区可能导致的内存溢出问题。另一个重要组件是EventLoop,它是Netty的事件循环,负责处理I/O事件并调度任务。 ChannelPipeline是Netty的...

Global site tag (gtag.js) - Google Analytics