В Java, являются статическими членами класса, разделяемыми между программами?
Я полагаю, что нет, это не так, потому что каждый процесс имеет свое собственное пространство памяти, конечно.
Но как работает вся JVM? Есть ли отдельная JVM в отдельном процессе для каждой запускаемой Java-программы? Имеются ли в программах Java, работающих в системе, что-то вообще? Существуют ли различия между ОС и реализациями JVM? Могу ли я использовать общие переменные программ (то есть напрямую через JVM, а не обычные механизмы IPC)? Есть ли более экзотические однопроцессорные JVM для специальных целей?
Как правило, что рекомендуется читать о кишках JVM? спецификация? Исходный код некоторой реализации? Веб-сайты? Книги?
Ответы
Ответ 1
В Java, являются статическими членами класса разделяемых между программами?
Класс определяется его полным именем и загрузчиком класса, который его загрузил. Если один и тот же класс находится в рамках одного процесса JVM, и две программы загружают класс через один и тот же загрузчик классов, тогда статические члены являются общими. Правила классификации грузов имеют чрезвычайно важное значение.
Я думаю, что нет, это не так, потому что каждый процесс имеет свои собственные пространство памяти, конечно.
Если вы используете две отдельные JVM для запуска двух приложений, вы правы. Но возьмите пример контейнеров приложений/сервлетов, таких как tomcat: они загружают несколько приложений через один и тот же процесс (хост-процесс tomcat).
Но как вся вещь JVM на самом деле работают? Есть ли отдельная JVM в отдельном процессе для каждой Java программу, которую я запускаю? Сделать Java программы, запущенные в общем доступе к системе что-нибудь вообще?
Каждый раз, когда вы вводите >java -cp...
в командной строке, вы создаете новый процесс. Имейте в виду, что при запуске eclipse или вызове java-задачи ant с помощью fork=true
вы также создаете новые процессы.
Существуют ли различия между ОС и Внедрение JVM? Могу ли я сделать программы используют общие переменные (т.е. непосредственно через JVM, а не обычные механизмы МПК)? Здесь более экзотические однопроцессорные JVM для специальные цели?
Как и плакат, есть такие проекты, как Terracota, которые облегчают это для вас. Общий подход для такого рода совместного использования - это распределенный кеш.
Ответ 2
Нет, статические переменные не находятся между JVM. Да, есть отдельный процесс JVM для каждого запускаемого приложения Java.
В некоторых реализациях я считаю, что они могут совместно использовать некоторые ресурсы (например, память для JIT-кода классов JRE), но я не уверен. Я считаю, что в настоящее время продолжается работа по обеспечению большего доступа, но все же в надежной форме. (Вы действительно не хотите, чтобы один JVM сбой повлиял на других.)
Нет, вы не можете прозрачно передавать общие переменные.
Я считаю, что есть книги о JVM, но я не могу рекомендовать их. Вероятно, вам лучше всего искать белые бумаги HotSpot для подробностей об этом. Этот - довольно хорошая отправная точка.
Ответ 3
вы должны, вероятно, искать больше в области загрузки класса, если ваш основной интерес заключается в том, как создаются статические члены класса.
Различные потоки на одной виртуальной машине могут иметь свои собственные экземпляры статического класса, если они используют отдельные загрузчики классов.
Классическим примером здесь будет Apache Tomcat, поддерживающий разные веб-приложения отдельно, хотя библиотеки lib могут быть общими для всех приложений.
Ответ 4
Зависит от реализации, но да, есть способы совместного использования вещей. Существует также работа по ее изменению, и Sun (через Apple) проделала большую работу по обмену данными между экземплярами виртуальной машины. Существует ссылка, в которой обсуждаются некоторые из здесь.
Для выполнения какого-либо совместного использования разработчик VM должен сделать это, так как программист не может ничего сделать, чтобы это произошло.
Спецификация VM здесь, есть и некоторые (более старые) книги об этом. Вы также можете посмотреть источник Kaffe, который довольно мал.
Ответ 5
Если вы хотите делиться переменными в JVM, вы можете посмотреть на такие продукты, как Terracotta. Они называют себя "сетевой сетевой памятью" и позволяют обмениваться ссылками объектов с помощью JVM с использованием технологии репликации.
Ответ 6
Вы правы в своем предположении. Да, каждая JVM - это отдельный процесс. Вы можете подтвердить это, открыв Диспетчер задач, когда вы запускаете две программы Java (сортировать процессы по имени и искать java.exe или javaw.exe).
Возможно, JVM соединяются друг с другом (например, с локальными сокетами), но ничего не встроено.
Ответ 7
Просто чтобы узнать, что сказал Кевин, нет реализаций JVM, о которых я знаю, что позволяет вам делиться статическими переменными в экземплярах JVM. Как указывали предыдущие ответы (правильно) - каждый экземпляр JVM - это собственный процесс.
Terracotta (которая является технологией кластеризации, а не JVM) позволяет произвольно обмениваться экземплярами объектов через границы процесса JVM, включая разделение статических переменных. Таким образом, прозвище "сетевая память". Во всех смыслах и целях при использовании технологии Terracotta в вашем процессе JVM все потоки во всех виртуальных машинах ведут себя так, как будто все они смотрят на одну большую и общую кучу. (Разумеется, с предостережениями, поскольку это физически невозможно, Terracotta управляет им с помощью сложных алгоритмов совместного использования и тиражирования, которые связаны с сетью io для перемещения данных, поэтому есть моменты, когда время ожидания и пропускная способность не будут сравниваться с доступом к собственной памяти).
В разделе "Поваренная книга" на сайте Terracotta есть множество примеров. Я рекомендую вам начать с Hello Clustered Instance Recipe, чтобы почувствовать как это работает.