Подтвердить что ты не робот

Как Java использует несколько ядер?

JVM работает в одном процессе, а потоки в JVM совместно используют кучу, принадлежащую этому процессу. Затем, как JVM использует несколько ядер, которые обеспечивают несколько потоков ОС для высоких concurrency?

4b9b3361

Ответ 1

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

В Java 7 есть инфраструктура fork/join для использования нескольких ядер.

Смежные вопросы:

Ответ 2

Зеленые темы были заменены на собственные потоки в Java 1.2.

Ответ 3

Java выиграет от нескольких ядер, если ОС распространяет потоки поверх доступных процессоров. Сам JVM не делает ничего особенного, чтобы равномерно распределять потоки по нескольким ядрам. Несколько вещей, которые нужно иметь в виду:

  • При реализации параллельных алгоритмов лучше всего создавать столько потоков, сколько есть ядер. (Runtime.getRuntime().availableProcessors()). Не больше, не меньше.
  • Используйте средства, предоставляемые пакетом java.util.concurrent.
  • Убедитесь, что в вашей личной библиотеке Java Concurrency in Practice.

Ответ 4

JVM выполняется в одном процессе, а потоки в JVM совместно используют кучу, принадлежащую этому процессу. Тогда как JVM использует несколько ядер, которые обеспечивают несколько потоков ОС для обеспечения высокого параллелизма?

Java будет использовать потоки базовой ОС, чтобы выполнять фактическую работу по выполнению кода на разных процессорах, если они работают на многопроцессорной машине. Когда каждый поток Java запускается, он создает связанный поток ОС, а ОС отвечает за планирование и т.д. Определенная JVM выполняет некоторое управление потоком и отслеживает его, а языковые конструкции Java, такие как volatile, synchronized, notify(), wait() и т.д. Все это влияет на состояние выполнения потока ОС.

JVM выполняется в одном процессе, а потоки в JVM совместно используют кучу, принадлежащую этому процессу.

JVM не обязательно "работать в одном процессе", потому что даже сборщик мусора и другой код JVM работают в разных потоках, и ОС часто представляет эти разные потоки как разные процессы. Например, в Linux один процесс, который вы видите в списке процессов, часто маскирует кучу разных потоковых процессов. Это даже если вы работаете на одноядерном компьютере.

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

Тогда как JVM использует несколько ядер, которые обеспечивают несколько потоков ОС для обеспечения высокого параллелизма?

Потоки получают улучшение производительности по нескольким причинам. Очевидно, что прямой параллелизм часто заставляет программу работать быстрее. Возможность одновременного выполнения нескольких задач ЦП может (хотя и не всегда) повысить производительность приложения. Вы также можете изолировать операции ввода-вывода в одном потоке, что означает, что другие потоки могут выполняться, пока поток ожидает ввода-вывода (чтение/запись на диск/сеть и т.д.).

Но с точки зрения памяти потоки получают много улучшений в производительности из-за локальной кэшированной памяти для каждого процессора. Когда поток выполняется на ЦП, локальный кэш высокоскоростной памяти для ЦП помогает потоку изолировать запросы на хранение локально, не тратя время на чтение или запись в центральную память. Вот почему volatile и synchronized вызовы включают конструкции синхронизации памяти, потому что кэш-память должна быть сброшена в основную память или аннулирована, когда потоки должны координировать свою работу или связываться друг с другом.