0

我们使用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 问题。

4

0 回答 0