Я разрабатываю коммуникационную библиотеку, основанную на неблокирующих SocketChannels NIO, чтобы я мог использовать select
, чтобы поддерживать низкий уровень загрузки процессора (и быстрее реагировать на другие события).SocketChannel
создаются внешне для моего потока и добавляются в список, который он обрабатывает, помечая их как неблокирующие и добавляя их в Selector
для операций READ (и WRITE, когда это необходимо, но в моей проблеме этого не происходит).
У меня есть небольшое приложение Swing для локальных тестов, которое может быть клиентом или сервером: клиент подключается к серверу, и они могут отправлять друг другу сообщения.Довольно простой и отлично работает, за исключением процессора, который достигает 100% (50% для каждого jvm), как только устанавливается соединение между клиентом и сервером.
Запуск jvisualvm
показывает мне, что sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run()
использует98% времени приложения, считая только 3 вызова метода!Трассировка принудительного стека показывает, что она блокируется при операции read
на FilteredInputStream
, на Socket
.
Я немного озадачен, поскольку не использую RMI (хотя я понимаю NIOи RMI может совместно использовать «транспортную» часть кода).Я видел несколько похожих вопросов, но каждый из них специально использовал RMI, а я нет.Ответы, которые я видел, состоят в том, что этот ConnectionHandler.run()
метод отвечает за маршалинг / демаршаллинг, когда я получаю 100% CPU без сетевого трафика.Я могу только вывести активное ожидание на сокеты, но это звучит странно, особенно с неблокирующими SocketChannel
...
Любая идея будет принята с благодарностью!