gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:57:40 26 4
gpt4 key购买 nike

我们正在运行 grpc-java 0.8.0 版服务器处理远程调用。服务器逻辑很简单,就是从数据库中获取给定id指定的数据,并设置到redis中。缓存。

JVM 参数配置为 -Xss256k -Xmx8G .一旦服务器启动并处理大约 400 QPS,JVM 就会占用 4GB(RES in 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 或更高版本)可解决该问题。目前尚不清楚问题是错误还是仅仅是由于在与分配缓冲区不同的线程上释放缓冲区而导致效率低下。

关于java - grpc 服务器启动时大量的 io.netty.buffer.PoolThreadCache$MemoryRegionCache$Entry 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32537965/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com