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

Netty内存泄露

 
阅读更多
转于自己在公司的Blog:
http://pt.alibaba-inc.com/wp/experience_1348/netty-nio-direct-memory-leak.html

在测试中发现,当不停的开关Netty的NioClientSocketChannelFactory(比如大量连接失败重连等情况下),存在Direct Memory泄露。
测试代码:
for (int i = 0; i < Integer.MAX_VALUE; i ++) {
    ChannelFactory channelFactory = new NioClientSocketChannelFactory(
            Executors.newCachedThreadPool(), Executors.newCachedThreadPool());
    Bootstrap bootstrap = new ClientBootstrap(channelFactory);
    bootstrap.setPipelineFactory(new ChannelPipelineFactory() { ... });
    ChannelFuture future = bootstrap.connect(serverAddress);
    future.await(); // or future.addListener(new ChannelFutureListener() { ... }); 
    Channel channel = future.getChannel();
    channel.close();
    // FIXME NioClientSocketChannelFactory direct buffer memory leak
    channelFactory.releaseExternalResources(); // or bootstrap.releaseExternalResources();
}

抛出的异常信息:
Caused by: java.lang.OutOfMemoryError: Direct buffer memory
at java.nio.Bits.reserveMemory(Bits.java:633)
at java.nio.DirectByteBuffer.<init>(DirectByteBuffer.java:95)
at java.nio.ByteBuffer.allocateDirect(ByteBuffer.java:288)
at org.jboss.netty.channel.socket.nio.SocketSendBufferPool$Preallocation.<init>(SocketSendBufferPool.java:159)
at org.jboss.netty.channel.socket.nio.SocketSendBufferPool.<init>(SocketSendBufferPool.java:46)
at org.jboss.netty.channel.socket.nio.NioWorker.<init>(NioWorker.java:84)
at org.jboss.netty.channel.socket.nio.NioClientSocketPipelineSink.<init>(NioClientSocketPipelineSink.java:74)
at org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory.<init>(NioClientSocketChannelFactory.java:135)


询问了Netty的作者Trustin Lee:
Trustin Lee 写道

ChannelFactories are never meant to be created many times. JVM is poor at managing direct buffers, so there's no way to fix this problem without using JNI. One possible workaround would be call System.gc() explicitly, but I'm not sure it's a reliable workaround.


看起来是JVM对direct buffer管理的问题,Netty估计也没有直接的办法解决,
只能静态化ChannelFactory规避,以减少泄露:
private static final NioClientSocketChannelFactory channelFactory = ...;

分享到:
评论
6 楼 gongjinglin 2016-08-11  
如果new了,服务端没启动的话,会产生大量线程。。。
5 楼 gongjinglin 2016-08-11  
你好,如果重连的话,把NioClientSocketChannelFactory做成静态,不new 一下,会存在问题,一直连接不上报错

Task org.jboss.netty.util.ThreadRenamingRunnable@2c1462a rejected
from java.util.concurrent.ThreadPoolExecutor@e27dc1b[Terminated, pool size = 0,
active threads = 0, queued tasks = 0, completed tasks = 0]
4 楼 guoqingcun 2016-08-02  
牛犇  
3 楼 0dragon 2015-11-27  
本来就是工厂模式  你非要new
2 楼 yanqingluo 2013-04-17  
不太明白.
1 楼 ioly 2012-05-29  
受益!

相关推荐

    详解SpringCloudGateway内存泄漏问题

    通过观察日志,发现了 io.netty.util.internal.OutOfDirectMemoryError 的异常,表明是堆外内存的问题。进一步分析,发现的是 ByteBuf.release() 没有被调用之前就被垃圾回收了,导致了内存泄漏。 内存泄漏问题的...

    netty-all-4.1.29.Final-sources.jar 最新版netty源码

    本jar包为最新的netty-all-4.1.29c.jar 可导入直接用 Netty 是一个利用 Java 的高级网络的能力,隐藏其背后的复杂性而提供一个易于使用的 API 的客户端/服务器框架。 Netty 是一个广泛使用的 Java 网络编程框架...

    netty in action 中文PDF 带目录

    - **内存泄露监控**:Netty 对于内存泄露问题进行了特别处理,如 squashing the famous poll bug 等。 - **聚合与分散操作**:Netty 对缓冲区的聚合和分散操作进行了优化,避免了内存泄露的风险。 ### 总结 Netty ...

    Netty实现原理浅析

    - **安全性**:提供了更好的内存管理机制,避免了内存泄漏等问题。 具体来说,Netty中有两种主要的`ChannelBuffer`实现: 1. **HeapChannelBuffer**:这是一种基于堆内存的实现方式,即缓冲区位于Java虚拟机的堆...

    netty4中文用户手册

    Netty的ByteBuf是一个灵活的可扩展的缓冲区,其抽象了字节序列并支持自动扩容以及内存回收等优化操作,显著降低了内存泄漏的风险。 Netty4用户手册还介绍了如何使用Netty实现基础的网络应用,例如抛弃服务器、应答...

    Netty In Action中文版

    - **Netty的解决方案**:Netty通过对NIO的深入优化和封装,解决了Java NIO中的一些常见问题,例如通过自定义的内存管理机制避免内存泄漏,通过智能的事件循环机制提高性能等。 #### 四、Netty的关键特性 - **高...

    Netty In Action中文版.pdf

    - 错误处理优化: 解决了常见的NIO问题,如内存泄漏、Epoll错误等。 #### 4. Netty的异步特性 - **异步IO的意义**: - 减少线程阻塞时间,提高资源利用率。 - 支持更多的并发连接,提高系统的可扩展性。 - **Netty...

    netty资料.rar

    6. **错误处理和异常安全**:Netty 对异常进行了良好的封装和处理,避免了因异常导致的资源泄露。 7. **灵活性**:Netty 可以轻松地与现有系统集成,支持动态配置,便于扩展和维护。 8. **生命周期管理**:Netty ...

    netty in action中文版

    Netty对Java NIO的问题进行了诸多优化,例如解决旧版Java NIO在某些情况下可能出现的Epoll空轮询bug和内存泄露问题。 Netty的设计理念是“快速和易于使用”,但是这并不影响使用Netty编写的程序的性能和可维护性。...

    基于netty实现的mqtt客户端,可用于Java、Android环境.zip

    Netty库在Java和Android平台上都能运行,但需要注意的是,Android系统对内存和CPU资源有限制,因此在构建Android版MQTT客户端时,需要优化资源使用,避免内存泄漏,以及确保线程安全。 5. **实际应用** MQTT...

    Netty案例集锦(并发编程篇)

    1. **Netty3版本升级遭遇内存泄漏案例**:该案例描述了一个项目在从旧版本升级到Netty3时遇到的内存泄漏问题。通过对内存使用情况进行分析,最终定位到了泄漏源头,并提出了相应的解决方案。 2. **Netty3版本升级...

    android+netty 的demo

    - 应用生命周期管理:确保在应用暂停或关闭时,正确关闭Netty连接,防止资源泄露。 - 性能优化:调整线程池大小、使用更轻量级的对象模型等,以适应移动设备的资源限制。 通过阅读"jan_s"的博客,你可能能找到更多...

    Netty_In_Action中文版.pdf

    Java NIO(New IO)引入了通道(Channels)和缓冲区(Buffers),以及选择器(Selectors)来处理多个连接,但同时也带来了一些问题,如 Epoll 错误和内存泄漏。Netty 通过其精心设计的架构解决了这些问题,提供了一...

    Netty开发视频教程

    - **内存泄漏**:分析Netty中可能引发内存泄漏的原因,如未释放的ByteBuf、ChannelFuture等,并提供相应的解决措施。 - **性能瓶颈排查**:介绍如何使用工具定位性能瓶颈,如CPU、内存占用情况等。 - **异常处理机制...

    netty in action 中文版 高清带目录 来个最便宜的

    Netty针对NIO中可能出现的内存泄露问题进行了优化,其中一种常见的问题是缓冲区(ByteBuffers)管理不当,Netty通过自动管理缓冲区的生命周期来避免这类问题。Netty还解决了Java NIO中的其他一些问题,比如著名的...

    93个netty高并发教学视频下载.txt

    84_Netty引用计数注意事项与内存泄露检测方式;85_Netty编解码器剖析与入站出站处理器详解;86_Netty自定义编解码器与TCP粘包拆包问题;87_Netty编解码器执行流程深入分析;88_ReplayingDecoder源码分析与特性解读;...

    Netty-In-Action中文版

    - **内存泄漏**:由于不当的内存管理而导致的内存泄漏问题。 - **Netty解决方案**: - **优化内存管理**:Netty采用了高效的内存池机制,减少了对象创建的次数,从而降低了垃圾回收的压力。 - **错误处理**:...

    Netty案例集锦(并发编程篇)有目录

    分析OOM错误的原因,可能涉及内存泄露、大对象分配等问题。 ##### 14.3 问题总结 总结OOM错误的解决方法,并提出预防内存泄漏的建议。 #### 15. Netty线上问题排查 ##### 15.1 背景说明 线上环境中遇到的Netty...

Global site tag (gtag.js) - Google Analytics