![](/img/trans.png)
[英]JMeter testing on GRPC Server: Server-side exception: io.grpc.netty.shaded.io.netty.handler.codec.http2.Http2Exception
[英]Huge number of io.netty.buffer.PoolThreadCache$MemoryRegionCache$Entry instances when grpc server started
我们正在运行grpc-java
版本0.8.0服务器来处理远程调用。 服务器逻辑非常简单,它只是从DB获取由给定ID指定的数据并将它们设置为redis
缓存。
JVM参数配置为-Xss256k -Xmx8G
。 一旦服务器启动并处理大约400 QPS,JVM就占用了4GB(RES在top
)内存。 我发出了jmap命令jmap -histo:live <pid>
并获得了以下转储文件:
num #instances #bytes class name
----------------------------------------------
1: 4998400 119961600 io.netty.buffer.PoolThreadCache$MemoryRegionCache$Entry
2: 212415 23503536 [B
3: 11076 20170816 [Lio.netty.buffer.PoolThreadCache$MemoryRegionCache$Entry;
4: 70853 10010904 [C
5: 28819 2518640 [Lio.netty.util.Recycler$DefaultHandle;
6: 31232 1998848 com.mysql.jdbc.ConnectionPropertiesImpl$BooleanConnectionProperty
7: 7287 1764136 [I
8: 70000 1680000 java.lang.String
9: 45766 1464512 java.util.Hashtable$Entry
10: 134 1291992 [D
11: 14376 1265088 io.netty.buffer.PooledUnsafeDirectByteBuf
12: 5527 1160200 [Ljava.util.HashMap$Node;
13: 16340 1116584 [[B
从中我们可以看到有大量的io.netty.buffer.PoolThreadCache$MemoryRegionCache$Entry
实例占用了大约100MB的内存。 (请注意, grpc
使用netty
作为它的通信层。)这似乎是不正常的。 即使这样,堆内对象也不能占用4GB内存。 这必须归功于堆外存储器的使用,例如netty
使用的直接缓冲区。
是否存在堆外内存泄漏?
为什么会这样? 以及如何解决或诊断这个问题?
升级到grpc-java 0.9.0或更高版本(引入Netty 4.1 Beta6或更高版本)可以解决此问题。 目前还不清楚问题是由于在不同的线程上释放缓冲区而不是由于分配它们而导致的错误或效率低下。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.