JVM работает в одном процессе, а потоки в JVM совместно используют кучу, принадлежащую этому процессу. Тогда как JVM использует несколько ядер, которые обеспечивают несколько потоков ОС для обеспечения высокого параллелизма?
Java будет использовать потоки базовой ОС для выполнения фактической работы по выполнению кода на разных процессорах, если они работают на многопроцессорной машине. Когда каждый поток Java запускается, он создает связанный поток ОС, а ОС отвечает за планирование и т. Д. Определенная JVM выполняет некоторое управление и отслеживание потока и конструкций языка Java, таких как volatile
, synchronized
, * 1007. *, wait()
и т. Д. - все это влияет на состояние выполнения потока ОС.
JVM работает в одном процессе, а потоки в JVM совместно используют кучу, принадлежащую этому процессу.
JVM не обязательно «работать в одном процессе», потому что даже сборщик мусора и другой код JVM работают в разных потоках, а ОС часто представляет эти разные потоки как разные процессы. Например, в Linux единственный процесс, который вы видите в списке процессов, часто маскирует кучу разных потоковых процессов. Это даже если вы работаете на одноядерном компьютере.
Однако вы правы в том, что все они используют одно и то же пространство кучи. Фактически они разделяют одно и то же пространство памяти, что означает код, интернированные строки, пространство стека и т. Д.
Тогда как JVM использует несколько ядер, которые обеспечивают несколько потоков ОС для обеспечения высокого параллелизма?
Потоки получают улучшения по нескольким причинам. Очевидно, что прямой параллелизм часто заставляет программу работать быстрее. Возможность одновременного выполнения нескольких задач ЦП может (хотя и не всегда) улучшить производительность приложения. Вы также можете изолировать операции ввода-вывода в одном потоке, что означает, что другие потоки могут выполняться, пока поток ожидает ввода-вывода (чтение / запись на диск / сеть и т. Д.).
Но с точки зрения памяти потоки значительно улучшают свою производительность из-за локальной кешируемой памяти для каждого процессора. Когда поток выполняется на ЦП, локальный кэш высокоскоростной памяти для ЦП помогает потоку изолировать запросы хранения локально, не тратя время на чтение или запись в центральную память. Вот почему вызовы volatile
и synchronized
включают конструкции синхронизации памяти, поскольку кэш-память должна быть сброшена в основную память или аннулирована, когда потоки должны координировать свою работу или связываться друг с другом.