Разве каждому потоку не нужна собственная копия JVM? - PullRequest
3 голосов
/ 15 марта 2012

Я пытаюсь выяснить, как работает JVM в отношении создания нескольких потоков. Я думаю, что моя ментальная модель, возможно, немного не в порядке, но сейчас я застрял на том, чтобы ухватиться за эту идею: поскольку в каждый момент времени работает только одна копия JVM, не будет ли каждый поток требовать свою собственную копию JVM? Я понимаю, что несколько потоков Java-приложения отображаются на нативные потоки OS, но я не понимаю, как потоки, которые не работают с JVM, обрабатывают байт-код; все ли потоки имеют доступ к JVM? спасибо, любая помощь приветствуется.

Ответы [ 3 ]

3 голосов
/ 15 марта 2012

Это немного упрощено, и кое-что из того, что я написал, не совсем правильно, но суть такова:

, поскольку в любой момент времени работает только одна копия JVM,каждый поток требует свою собственную копию JVM?

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

Одна стратегия, состоящая в том, чтобы несколько потоков нормально работали вместе с некоторым общим ресурсом (таким как JVM (стек, куча, компилятор байт-кода), консоль, принтер и т. Д.), Действительно имели копии для каждого потока (один компьютеркаждый человек).Например, каждый поток имеет свой собственный стек.

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

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

Существует также еще один продвинутый механизм, позволяющий нескольким потокам работать с общими ресурсами.Люди, разработавшие JVM, использовали эти методы, и поэтому вам не нужна копия JVM для каждого потока.

3 голосов
/ 07 июня 2013

но я не понимаю, как потоки, на которых не работает JVM, обрабатывают байт-код;все ли потоки имеют доступ к JVM?

http://www.artima.com/insidejvm/ed2/jvmP.html объясняет это хорошо.Вот что он говорит:

" Каждый поток работающего Java-приложения является отдельным экземпляром механизма выполнения виртуальной машины. От начала своего времени жизни до конца потоклибо выполнение байт-кодов, либо собственных методов. Поток может выполнять байт-коды напрямую, путем интерпретации или выполнения нативно в кремнии, или косвенно, путем своевременной компиляции и выполнения результирующего собственного кода. Реализация виртуальной машины Java может использовать другие потоки, невидимыеработающее приложение, такое как поток, который выполняет сборку мусора. Такие потоки не должны быть «экземплярами» механизма выполнения реализации. Однако все потоки, которые принадлежат запущенному приложению, являются механизмами выполнения в действии. "

Подводя итог моему пониманию этого:

Для каждого потока (кроме потока GC и другого) соответствующий экземпляр ExecutionEngine (в той же JVM) преобразует байт-коды в машинные инструкции, а собственный поток ОС выполняет ихмашинные инструкции.Конечно, я не говорю о зеленой нити здесь.

2 голосов
/ 15 марта 2012

По определениям потоки в приложении Java совместно используют одно и то же пространство памяти, поэтому выполняются в одной и той же JVM. Таким образом, вы можете легко обмениваться объектами между несколькими потоками, выполнять синхронизацию и все такое, что происходит в JVM.

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

...