GRP C Java - предотвращение утечек памяти - PullRequest
0 голосов
/ 19 апреля 2020

Я пытаюсь запретить GRP C использовать более одного потока на канал. Для этого я устанавливаю однопотокового исполнителя со следующим кодом:

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();

Затем я создаю асиную заглушку для каждого канала.

Однако, похоже, это не работает как Я все еще порождаю слишком много потоков в моей программе, в конце концов не хватает памяти.

Должен ли я вместо этого передать исполнителю заглушку? Или что-то в корне не так.

Заранее спасибо

1 Ответ

1 голос
/ 20 апреля 2020

Дополнительные порожденные потоки - это, вероятно, EventL oop потоки (по умолчанию он может создавать до # основных потоков). Существует возможность предоставить EventLoopGroup в NettyChannelBuilder. Чтобы использовать этот API, вам также нужно установить ChannelType. EventLoopGroup и Канал Тип от netty для получения дополнительной информации см. Связанный javado c.

Вы можете использовать Epoll, если на linux в противном случае использование NIO является текущим поведением gRP C. Ниже приведен пример использования NIO. Все сетевые события происходят в потоке событий l oop, поэтому использование меньшего количества потоков может существенно повлиять на общую производительность (зависит от того, как используется канал). Вы также можете рассмотреть возможность использования directExecutor и выделить больше потоков для EventLoopGroup.

NioEventLoopGroup sharedEventLoopGroup = new NioEventLoopGroup(numThread);
ManagedChannel channel = NettyChannelBuilder
    .forAddress(host, port + i + 1)
    .usePlaintext()
    .channelType(NioSocketChannel.class)
    .eventLoopGroup(sharedEventLoopGroup)
    .executor(Executors.newSingleThreadExecutor())
    .build();
...