首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GRPC Java -防止内存泄漏

GRPC Java -防止内存泄漏
EN

Stack Overflow用户
提问于 2020-04-19 22:22:11
回答 1查看 616关注 0票数 0

我试图阻止GRPC在每个通道上使用多个线程。为此,我使用以下代码设置了一个单线程执行器:

代码语言:javascript
复制
for (int i = 0; i < 3 * numFaults + 1; i++) {
            //One thread for each channel
            ManagedChannel channel = NettyChannelBuilder
                    .forAddress(host, port + i + 1)
                    .usePlaintext()
                    .executor(Executors.newSingleThreadExecutor())
                    .build();

然后,我为每个通道创建一个asyn存根。

然而,这似乎不起作用,因为我仍然在我的程序中产生太多的线程,最终耗尽内存。

我是否应该将executor传递给存根?还是有什么根本性的问题。

提前感谢

EN

回答 1

Stack Overflow用户

发布于 2020-04-20 09:39:21

额外产生的线程可能是 EventLoop 线程(默认情况下它最多可以创建 # 个核心线程)。 在 NettyChannelBuilder 中有一个提供 EventLoopGroup 的选项。 要使用此 API,您还需要设置 ChannelType。 EventLoopGroupChannel Type 来自 netty,如果您有兴趣,请参阅链接的 javadoc 了解更多详细信息。

如果是在linux上,则可以使用Epoll,否则使用NIO是当前的gRPC行为。下面的示例是使用NIO。所有网络事件都发生在事件循环线程上,因此使用较少的线程会显著影响整体性能(取决于通道的使用方式)。您还可以考虑使用directExecutor并为EventLoopGroup分配更多的线程。

代码语言:javascript
复制
NioEventLoopGroup sharedEventLoopGroup = new NioEventLoopGroup(numThread);
ManagedChannel channel = NettyChannelBuilder
    .forAddress(host, port + i + 1)
    .usePlaintext()
    .channelType(NioSocketChannel.class)
    .eventLoopGroup(sharedEventLoopGroup)
    .executor(Executors.newSingleThreadExecutor())
    .build();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61305866

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档