我们使用netty来构建一个数据传输协议。只是现在正在从 netty 3.10 升级到 netty 4.1 的过程中。升级后,由于 NioEventLoop 实例的堆耗尽,现在运行应用程序一段时间会遇到 OOM。hprof 的泄漏分析表明以下泄漏嫌疑人:
Problem Suspect 1
1,383 instances of "io.netty.channel.nio.NioEventLoop",
loaded by "sun.misc.Launcher$AppClassLoader @ 0xb50b4248" occupy 786,367,920 (66.11%) bytes.
Keywords
sun.misc.Launcher$AppClassLoader @ 0xb50b4248
io.netty.channel.nio.NioEventLoop
具有最大 Retained Heap 的对象的直方图:
Class Name | Objects | Shallow Heap | Retained Heap
--------------------------------------------------------------------------------
byte[] | 23,476 | 880,160,656 | >= 880,160,656
io.netty.channel.nio.NioEventLoop | 11,032 | 1,676,864 | >= 789,432,888
io.netty.channel.nio.NioEventLoopGroup| 1,379 | 44,128 | >= 775,460,376
--------------------------------------------------------------------------------
这是否表明在从 netty 3 升级到 4 时与某些资源的释放有关的一些常见错误?
编辑:找到罪魁祸首泄漏。我们有一个重用的客户端方法,每个调用都会实例化一个新的 EventLoopGroup,从而泄漏先前实例化的线程池。修复它并解决 OutOfMemory 问题。