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