Виртуальная машина Java - Как она выделяет ресурсы?

StackOverflow https://stackoverflow.com/questions/2962244

Вопрос

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

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

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

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

Существует отличная серия статей «Теория и практика Java» от Java Adurrulency and Guuru Guru Brian Goetz:

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top