В Java разделены ли статические члены класса между программами? - PullRequest
17 голосов
/ 26 марта 2009

Я думаю, что нет, это не так, потому что, конечно, у каждого процесса есть собственное пространство памяти.

Но как на самом деле работает весь JVM? Существует ли отдельная JVM в отдельном процессе для каждой Java-программы, которую я запускаю? Программы Java, работающие в системе, имеют что-то общее? Есть ли различия между ОС и реализациями JVM? Могу ли я заставить программы совместно использовать переменные (т.е. непосредственно через JVM, а не через обычные механизмы IPC)? Существуют ли более экзотические однопроцессные JVM для специальных целей?

Вообще, что можно почитать о смелости JVM? spec ? Исходный код какой-то реализации? Веб-сайты? Книги?

Ответы [ 7 ]

26 голосов
/ 26 марта 2009

В Java статические члены класса поделился между программами?

Класс определяется его полным именем и загрузчиком классов, который его загрузил. Если один и тот же класс находится в одном и том же процессе JVM и две программы загружают класс через один и тот же загрузчик классов, статические члены являются общими. Правила загрузки классов чрезвычайно важны.

Я думаю, что нет, это не так, потому что каждый процесс имеет свой Пространство памяти, конечно.

Если вы используете две отдельные JVM для запуска двух приложений, вы правы. Но возьмем случай с контейнерами приложений / сервлетов, такими как tomcat: они загружают несколько приложений через один процесс (хост-процесс tomcat).

Но как работает вся JVM? на самом деле работа? Есть ли отдельная JVM в отдельном процессе для каждой Java программу, которую я запускаю? Делать Java программы, работающие в системном ресурсе вообще что-нибудь?

Каждый раз, когда вы вводите >java -cp... в командной строке, вы создаете новый процесс. Помните, что когда вы запускаете eclipse или вызываете задачу ant java с помощью fork=true, вы также создаете новые процессы.

Есть ли различия между ОС и Реализации JVM? Могу я сделать программы разделяют переменные (т.е. непосредственно через JVM, а не обычные механизмы МПК)? Здесь более экзотические однопроцессные JVM для специальные цели?

Как сказал один из авторов, есть такие проекты, как Terracota, которые способствуют этому для вас. Общий подход для этого вида совместного использования - распределенный кеш.

7 голосов
/ 26 марта 2009

Нет, статические переменные отсутствуют между JVM. Да, для каждого запускаемого Java-приложения есть отдельный процесс JVM.

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

Нет, нельзя заставить программы прозрачно делиться переменными.

Я думаю, что есть книги о JVM, но я не могу рекомендовать ни одной. Вам, вероятно, лучше всего искать официальные документы HotSpot для получения подробной информации об этом. Этот является довольно хорошей отправной точкой.

6 голосов
/ 26 марта 2009

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

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

Классическим примером здесь будет Apache Tomcat , позволяющий разделять различные веб-приложения, хотя библиотеки jar-файлов могут быть общими для всех приложений.

2 голосов
/ 26 марта 2009

Если вы хотите совместно использовать переменные в JVM, вы можете посмотреть на такие продукты кластеризации, как Terracotta . Они называют себя «памятью, подключенной к сети» и позволяют вам совместно использовать ссылки на объекты в JVM, используя технологию репликации.

2 голосов
/ 26 марта 2009

Зависит от реализации, но да, есть способы, которыми все делятся. В настоящее время ведется работа по ее изменению, и Sun (через Apple) проделала большую работу по обмену данными между экземплярами виртуальной машины. Есть ссылка, которая обсуждает некоторые из этих здесь .

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

Спецификация виртуальной машины здесь , также есть несколько (более старых) книг об этом. Вы также можете посмотреть на источник для Kaffe , который довольно мал.

1 голос
/ 26 марта 2009

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

Terracotta (это технология кластеризации, а не JVM) допускает произвольное совместное использование экземпляров объектов через границы процесса JVM, включая совместное использование статических переменных. При этом прозвище «сеть подключена к памяти». В любом случае, при использовании технологии Terracotta в вашем JVM-процессе все потоки во всех виртуальных машинах ведут себя так, как будто они все смотрят на одну большую общую кучу. (Конечно, с учетом предостережений, поскольку это физически невозможно, Terracotta управляет им с помощью сложных алгоритмов совместного использования и репликации, в которых для перемещения данных используется сеть io - поэтому бывают случаи, когда задержка и пропускная способность не сравниваются с собственным доступом к памяти)

В разделе Cookbook сайта Terracotta имеется множество примеров - я рекомендую вам начать с Hello Clustered Instance Recipe , чтобы понять, как он работает.

1 голос
/ 26 марта 2009

Вы правы в своем предположении. Да, каждая JVM - это отдельный процесс. Вы можете убедиться в этом, открыв диспетчер задач при запуске двух программ Java (сортируйте процессы по имени и ищите java.exe или javaw.exe).

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

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