div.main {margin-left: 20pt; margin-right: 20pt}
Java против потоков
Вычислительные потоки - вот те средства, которые позволяют
использовать действительно много поточные средства. Как обычно реализуются эти
вичислительные потоки (thread)? Здесь существует два способа - прямое
отображение Java вычислительного потока в поток операционной системы или же
отображения множества потоков виртуальной машины в один поток операционной
системы (так называемая технология Green Thread).
И так к примеру мы имеем некий сервис, который обрабатывает некие
события, события эти появляются просто толпами, но на их обработку уходить очень
и очень мало времени. На каждое событие запускается новый вычислительный поток
(для его обработки). По такой схеме, к примеру, может работать и WEB сайт или
любой другой публичный сервис.
Все в такой схеме хорошо, пока одновременных потоков бывает несколько
десятков или сотен. И даже если они и не выполняют никакой работы, существует
опасность разрушения виртуальной машины. Связанно это с ограничением на
количество одновременно запущенных вичислительных потоков в операционной системе
(рассматривается случай прямого отображения потоков).
Для проверки и тестирования систем разработан тест (Java, С++ и
Delphi), в результате деятельности теста - запускается большое количество
однвременных потоков. Когда ограничение будет превышено - работа виртуальной
машины будет прекращена. В данных тестах, потоки только запускаются, но ничего
не выполняют.
Hardware/OS |
JVM |
Результат (потоков) |
Результат работы |
PIII, W2K Prof, 192 RAM |
Sun JDK 1.3.1 rc2 |
~7000 |
OutOfMemoryError |
W2K Prof, P-III 750, 256M |
native (Delphi) |
~9000 |
|
W2K Prof, P-III 750, 256M |
? |
~7000 |
OutOfMemoryError |
Linux |
SUN JDK 1.3.0_02 (Green threads) |
9999 |
|
Linux |
Blackdown-1.3.0 (Green threads) |
9999 |
|
Linux |
SUN JDK 1.3.1 (Green threads) |
9999 |
|
WinNT4 sp6, Cel333/128 |
SUN JDK JDK-1.2.2_007 (Native) |
1929 |
OutOfMemoryError |
WinNT4 sp6, Cel333/128 |
native (Delphi) |
~17000 (real ~2000) |
|
WinNT4 sp6, Cel333/128 |
native (C++) |
3822 |
Error 31 |
P3/256, NT4 SP6 |
native (C++) |
4136 |
Error 31 |
P3/256, NT4 SP6 |
J2RE 1.3.0 IBM JIT (Native) |
4163 |
OutOfMemoryError |
P3/256, NT4 SP6 |
Java HotSpot(TM) Client 1.3.0-C (Native) |
4157 |
OutOfMemoryError |
Итак что же у нас получается? Что Green threads позволяют создать
большее количество потоков, чем при использовании нативных потоков. Однако не
все так радужно, отображение множества потоков на один поток так же не лишено
недостатков. И здесь придется выбирать между "двух зол".
Отдельных результатов заслуживает разговор о нативных
"тестировалках" - программа написанная на дельфи хоть и показывает немыслеммые
результаты десятки тысяч потоков, но на самом деле их всего не больше ~2000.
Ясность тут вносит тест на С++, именно он почти и показывает реальные результаты
(из нативных). Дело здесь все в размере стека в конкретной операционной системе
(в данном случае NT WS). По окончании места в стеке - новые потоки прекращают
создаваться и возникает ошибка либо связанная с отсутствием памяти либо с
отказом "устройства" создания новых потоков. Добиться результата на нативном
коде сопоставимым с Java удалось лишь только после уменьшения размера памяти
резервируемого в стеке для каждого нового потока (без такого "шаманства"
результаты были около 2000 (т.е. на уровне реального количества потоков в
дельфи)). К слову говоря - Java класс получился по размеру самым маленьким.
|