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