`
javatar
  • 浏览: 1677633 次
  • 性别: 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  
受益!

相关推荐

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

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

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

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

    精通并发与netty视频教程(2018)视频教程

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

    精通并发与netty 无加密视频

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

    Netty In Action中文版

    Netty是基于Java NIO的网络应用框架,如果你是Java网络方面的新手,那么本章将是你学习Java网络应用的...Java网络API,探讨Java网络API的优点和缺点并阐述Netty是如何解决Java中的问题的,比如Eploo错误或内存泄露问题

    Netty In Action中文版.docx

    它说明了如何使用基本的Java网络API,探讨Java网络API的优点和缺点并阐述Netty是如何解决Java中的问题的,比如Eploo错误或内存泄露问题。  在本章的结尾,你会明白什么是Netty以及Netty提供了什么,你会理解Java ...

    精通并发与 netty 视频教程(2018)视频教程

    82_Netty引用计数原子更新揭秘与AtomicIntegerFieldUpdater深度剖析 83_AtomicIntegerFieldUpdater实例演练与volatile关键字分析 84_Netty引用计数注意事项与内存泄露检测方式 85_Netty编解码器剖析与入站出站处理器...

    http-benchmark-netty:基于Java Netty的HTTP客户端工具 & HTTP高性能测试工具。参数灵活定制、支持邮件报表等。Python Tornado版

    测试工具参数配置灵活,可满足一般性能测试、延迟测试、最大连接数测试、吞吐量测试、压力测试、长时间稳定性测试、内存泄漏测试等场景。测试工具基于频繁的业务测试不断优化改进,稳定可靠、实用性强。简介:基于...

    基于java的netty实现的可靠udp网络库(kcp算法),包含fec实现,可用于游戏,视频,加速等业务.zip

    Java是一种高性能、跨平台的面向...自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。

    Spring泄漏演示

    重现Spring WebFlux内存泄漏启动应用程序并设置VM选项-Dio.netty.leakDetectionLevel=paranoid 用打开文件leak-test.jmx 单击jmeter中的开始按钮,您将在一分钟内看到网络泄漏日志。

    2018美团点评后台开发干货.zip

    2018美团点评后台开发干货 ,包括netty堆外内存泄露排查等干货

    java 进阶之路.zip

    面试高频算法、akka、多线程、NIO...自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。

    http-benchmark-tornado:基于Python Tornado的高级http性能测试工具。JavaNetty版:https:github.comjunneyanghttp-benchmark-netty

    测试工具参数配置灵活,可满足一般性能测试,延迟测试,最大连接数测试,防爆测试,压力测试,持久稳定性测试,内存泄漏测试等场景。测试工具基于不断的业务测试不断优化改进,稳定可靠,实用性强。 特征: 高性能,...

Global site tag (gtag.js) - Google Analytics