GRPC Java-防止内存泄漏

GRPC Java-防止内存泄漏,java,multithreading,grpc,grpc-java,Java,Multithreading,Grpc,Grpc Java,我试图阻止GRPC在每个通道中使用多个线程。为此,我使用以下代码设置了一个单线程执行器: for (int i = 0; i < 3 * numFaults + 1; i++) { //One thread for each channel ManagedChannel channel = NettyChannelBuilder .forAddress(host, port + i + 1)

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

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();
for(int i=0;i<3*numFaults+1;i++){
//每个通道一个线程
ManagedChannel=NettyChannel Builder
.forAddress(主机,端口+i+1)
.usePlaintext()
.executor(Executors.newSingleThreadExecutor())
.build();
然后,我为每个通道创建一个asyn存根

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

我应该把遗嘱执行人交给存根吗?还是有什么根本性的错误


提前感谢

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

如果在linux上,您可以使用Epoll,否则使用NIO是当前gRPC行为。 所有的网络事件都发生在事件循环线程上,因此使用较少的线程会显著地影响整体性能(取决于如何使用信道)。还可以考虑使用EntRoCultGROUP的更多线程。
NioEventLoopGroup sharedEventLoopGroup = new NioEventLoopGroup(numThread);
ManagedChannel channel = NettyChannelBuilder
    .forAddress(host, port + i + 1)
    .usePlaintext()
    .channelType(NioSocketChannel.class)
    .eventLoopGroup(sharedEventLoopGroup)
    .executor(Executors.newSingleThreadExecutor())
    .build();

“每个通道使用多个线程”但是每个通道只有一个单线程执行器。是的,但是当我看到我的机器上的线程使用情况时,我看到它仍在生成许多线程。目标是要指出,很少会看到线程导致内存不足,除非有太多线程。如果内存不足,请分析堆转储以查看有什么。可能是由于泄漏或者可能不是。另外,请修改标题,因为这不是内存泄漏问题。