Как Java использует несколько ядер? - PullRequest
61 голосов
/ 14 декабря 2010

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

Ответы [ 4 ]

27 голосов
/ 14 декабря 2010

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

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

Вопросы, относящиеся:

18 голосов
/ 14 декабря 2010

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

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

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

17 голосов
/ 23 февраля 2017

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

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

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...