Я прочитал несколько сообщений о java.net и java.nio здесь, в StackOverflow, и в некоторых блогах. Но я все еще не могу понять, когда следует предпочесть NIO резьбовым сокетам. Не могли бы вы изучить мои выводы ниже и сказать, какие из них неверны, а какие упущены?
Поскольку в потоковой модели вам нужно выделить поток для каждого активного соединения, а каждый поток занимает около 250 килобайт памяти для своего стека, с моделью потока на сокет вам быстро не хватит памяти при большом количестве одновременных подключений. В отличие от NIO.
В современных операционных системах и процессорах большое количество активных потоков и время переключения контекста можно считать практически несущественным для производительности.
Пропускная способность NIO может быть ниже, потому что select () и poll (), используемые асинхронными библиотеками NIO в средах с высокой нагрузкой, дороже, чем пробуждение и перевод потоков в спящий режим.
NIO всегда был медленнее, но он позволяет обрабатывать больше одновременных подключений. По сути, это компромисс между временем и пространством: традиционный ввод-вывод быстрее, но требует большего объема памяти, NIO медленнее, но использует меньше ресурсов.
Java имеет жесткое ограничение на количество одновременных потоков 15000/30000 в зависимости от JVM, и это ограничит поток на модель подключения до этого максимального количества одновременных подключений, но JVM7 не будет иметь такого ограничения (не может подтвердить эти данные).
Итак, в качестве заключения можно получить следующее:
- Если у вас десятки тысяч одновременных подключений - NIO - лучший выбор, если только скорость обработки запросов не является для вас ключевым фактором.
- Если у вас меньше этого - поток на соединение является лучшим выбором (учитывая, что вы можете позволить себе объем ОЗУ для хранения стеков всех параллельных потоков до максимума)
- С Java 7 вы можете захотеть перейти на NIO 2.0 в любом случае.
Я прав?