繁体   English   中英

grpc服务器启动时,大量的io.netty.buffer.PoolThreadCache $ MemoryRegionCache $ Entry实例

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM