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