转于自己在公司的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 = ...;
分享到:
相关推荐
通过观察日志,发现了 io.netty.util.internal.OutOfDirectMemoryError 的异常,表明是堆外内存的问题。进一步分析,发现的是 ByteBuf.release() 没有被调用之前就被垃圾回收了,导致了内存泄漏。 内存泄漏问题的...
本jar包为最新的netty-all-4.1.29c.jar 可导入直接用 Netty 是一个利用 Java 的高级网络的能力,隐藏其背后的复杂性而提供一个易于使用的 API 的客户端/服务器框架。 Netty 是一个广泛使用的 Java 网络编程框架...
- **内存泄露监控**:Netty 对于内存泄露问题进行了特别处理,如 squashing the famous poll bug 等。 - **聚合与分散操作**:Netty 对缓冲区的聚合和分散操作进行了优化,避免了内存泄露的风险。 ### 总结 Netty ...
- **安全性**:提供了更好的内存管理机制,避免了内存泄漏等问题。 具体来说,Netty中有两种主要的`ChannelBuffer`实现: 1. **HeapChannelBuffer**:这是一种基于堆内存的实现方式,即缓冲区位于Java虚拟机的堆...
Netty的ByteBuf是一个灵活的可扩展的缓冲区,其抽象了字节序列并支持自动扩容以及内存回收等优化操作,显著降低了内存泄漏的风险。 Netty4用户手册还介绍了如何使用Netty实现基础的网络应用,例如抛弃服务器、应答...
- **Netty的解决方案**:Netty通过对NIO的深入优化和封装,解决了Java NIO中的一些常见问题,例如通过自定义的内存管理机制避免内存泄漏,通过智能的事件循环机制提高性能等。 #### 四、Netty的关键特性 - **高...
- 错误处理优化: 解决了常见的NIO问题,如内存泄漏、Epoll错误等。 #### 4. Netty的异步特性 - **异步IO的意义**: - 减少线程阻塞时间,提高资源利用率。 - 支持更多的并发连接,提高系统的可扩展性。 - **Netty...
6. **错误处理和异常安全**:Netty 对异常进行了良好的封装和处理,避免了因异常导致的资源泄露。 7. **灵活性**:Netty 可以轻松地与现有系统集成,支持动态配置,便于扩展和维护。 8. **生命周期管理**:Netty ...
Netty对Java NIO的问题进行了诸多优化,例如解决旧版Java NIO在某些情况下可能出现的Epoll空轮询bug和内存泄露问题。 Netty的设计理念是“快速和易于使用”,但是这并不影响使用Netty编写的程序的性能和可维护性。...
Netty库在Java和Android平台上都能运行,但需要注意的是,Android系统对内存和CPU资源有限制,因此在构建Android版MQTT客户端时,需要优化资源使用,避免内存泄漏,以及确保线程安全。 5. **实际应用** MQTT...
1. **Netty3版本升级遭遇内存泄漏案例**:该案例描述了一个项目在从旧版本升级到Netty3时遇到的内存泄漏问题。通过对内存使用情况进行分析,最终定位到了泄漏源头,并提出了相应的解决方案。 2. **Netty3版本升级...
- 应用生命周期管理:确保在应用暂停或关闭时,正确关闭Netty连接,防止资源泄露。 - 性能优化:调整线程池大小、使用更轻量级的对象模型等,以适应移动设备的资源限制。 通过阅读"jan_s"的博客,你可能能找到更多...
Java NIO(New IO)引入了通道(Channels)和缓冲区(Buffers),以及选择器(Selectors)来处理多个连接,但同时也带来了一些问题,如 Epoll 错误和内存泄漏。Netty 通过其精心设计的架构解决了这些问题,提供了一...
- **内存泄漏**:分析Netty中可能引发内存泄漏的原因,如未释放的ByteBuf、ChannelFuture等,并提供相应的解决措施。 - **性能瓶颈排查**:介绍如何使用工具定位性能瓶颈,如CPU、内存占用情况等。 - **异常处理机制...
Netty针对NIO中可能出现的内存泄露问题进行了优化,其中一种常见的问题是缓冲区(ByteBuffers)管理不当,Netty通过自动管理缓冲区的生命周期来避免这类问题。Netty还解决了Java NIO中的其他一些问题,比如著名的...
84_Netty引用计数注意事项与内存泄露检测方式;85_Netty编解码器剖析与入站出站处理器详解;86_Netty自定义编解码器与TCP粘包拆包问题;87_Netty编解码器执行流程深入分析;88_ReplayingDecoder源码分析与特性解读;...
- **内存泄漏**:由于不当的内存管理而导致的内存泄漏问题。 - **Netty解决方案**: - **优化内存管理**:Netty采用了高效的内存池机制,减少了对象创建的次数,从而降低了垃圾回收的压力。 - **错误处理**:...
分析OOM错误的原因,可能涉及内存泄露、大对象分配等问题。 ##### 14.3 问题总结 总结OOM错误的解决方法,并提出预防内存泄漏的建议。 #### 15. Netty线上问题排查 ##### 15.1 背景说明 线上环境中遇到的Netty...