виртуальная машина Java - как она распределяет ресурсы? - PullRequest
4 голосов
/ 03 июня 2010

Я тестирую производительность системы потоковой передачи данных, которая поддерживает непрерывные запросы.

Вот как это работает: - Существует служба опроса, которая отправляет данные в мою систему. - Когда данные поступают в систему, каждый запрос оценивается на основе окна потока в текущий момент времени. - Окно скользит при передаче данных.

Моя проблема в том, что когда я добавляю в систему больше запросов, я должен ожидать, что пропускная способность уменьшится , потому что она не справляется со скоростью передачи данных.

Однако на самом деле я наблюдаю увеличение пропускной способности.

Я не могу понять, почему это так, и я предполагаю, что это как-то связано с тем, как JVM распределяет процессор, память и т. Д.

Может кто-нибудь пролить свет на мою проблему?

Ответы [ 5 ]

4 голосов
/ 03 июня 2010

Большинство виртуальных машин Java изначально обрабатывают байт-код JVM, который немного медленнее, чем выполнение машинного кода. По мере того, как JVM обнаруживает, что вы часто используете определенный раздел кода, он компилирует этот раздел кода в машинный код (что увеличивает скорость его обработки). В результате иногда стресс-тестирование кода или даже оставление кода на более длительный период времени приводит к ускорению выполнения, а не к замедлению. JSM HotSpot (по умолчанию от SUN) является наиболее известной JVM, которая выполняет собственную компиляцию для ускорения выполнения кода.

Кроме того, многие библиотеки Java очень развиты по сравнению с некоторыми библиотеками, с которыми вы, возможно, сталкивались в прошлом. Это означает, что вместо выделения потока для обработки запроса они могут использовать неблокирующие прослушиватели на сокетах, пулы потоков переназначаемых рабочих потоков или любое количество методов, подходящих для обработки с высокой пропускной способностью. Это в сочетании с самонастройкой JIT (подобной HotSpot) делает сравнительный анализ Java довольно сложной задачей. Вообще говоря, чем дольше они работают, тем быстрее становится все.

2 голосов
/ 03 июня 2010

Ваш вопрос очень легок по техническим деталям, но вот предположение.

Если потоковая подсистема ввода-вывода достаточно эффективна (например, на основе select), а отдельный клиент не насыщает сетевой интерфейс, то наличие множества клиентов может увеличить общую пропускную способность просто потому, что процесс сервера может обрабатывать больше данных.

2 голосов
/ 03 июня 2010

Как всегда, ответ на профиль. Но просто для предположения: виртуальной машине Hotspot требуется немало проходов, прежде чем она начнет делать магию JIT.

0 голосов
/ 03 июня 2010

Еще одна тупая теория: ну, конечно, пропускная способность увеличивается с увеличением нагрузки, по крайней мере, пока вы не достигнете емкости. Если вы можете обрабатывать в среднем 100 запросов в секунду и отправляете в среднем 10 запросов в секунду, пропускная способность составит 10 запросов в секунду. Если вы увеличите нагрузку в среднем до 100qps, пропускная способность будет (почти) 100qps. Это ухудшается после этого конечно. Вы не близки к мощности? Извините, если вы что-то исключили.

0 голосов
/ 03 июня 2010

Производительность Java-приложения, и особенно микробенчмаркинг (бенчмаркинг очень маленького фрагмента кода), может быть очень сложной в Java, потому что JVM, JIT-компилятор и сборщик мусора могут оказывать большое и трудно предсказуемое влияние на производительность. программы.

Есть замечательная серия статей "Теория и практика Java", написанная гуру параллелизма и производительности Java Брайаном Гетцем:

...