JVM без сборки "мусора"

Я читал во многих потоках, что невозможно выключить сборку "мусора" на JVM Sun. Однако в целях нашего исследовательского проекта нам нужна эта функция. Кто-либо может рекомендовать реализацию JVM, которая не имеет сборки "мусора" или которая позволяет выключать ее?Спасибо.

17
задан H-H 5 June 2010 в 10:44
поделиться

8 ответов

Я хотел найти быстрый способ сохранить все объекты в памяти для простого первоначального доказательства концепции.

Самый простой способ сделать это - запустить JVM с кучей, которая настолько велика, что GC никогда не нужно запускать. Установите для параметров -Xmx и -Xms большое значение и включите ведение журнала ГХ, чтобы убедиться, что ГХ не работает в течение всего теста.

Это будет быстрее и проще, чем изменение JVM.


(Оглядываясь назад, это может не сработать. Я смутно припоминаю свидетельства того, что JVM не всегда соблюдает параметр -Xms , особенно если он был действительно большим. Тем не менее, этот подход стоит попробовать, прежде чем пробовать какой-нибудь гораздо более сложный подход ... например, изменение JVM.)

Кроме того, все это кажется мне ненужным (даже контрпродуктивным) для того, чего вы на самом деле пытаетесь достичь. Сборщик мусора не выбрасывает объекты, если они не являются мусором. А если они мусор, вы не сможете их использовать. И производительность системы с отключенным / отключенным сборщиком мусора не будет показывать, как будет работать реальное приложение.


ОБНОВЛЕНИЕ - Начиная с Java 11, у вас есть гораздо более простой вариант использования сборщика мусора Epsilon (без операций); см.

При запуске JVM вы добавляете следующие параметры:

-XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC

Когда куча заполнена, попытки собрать мусор не предпринимаются. Вместо этого Epsilon GC завершает работу JVM.

16
ответ дан 30 November 2019 в 12:06
поделиться

В зависимости от ваших потребностей, это может сработать:

Используя опцию -Xbootclasspath, вы можете указать свою собственную реализацию классов API. Тогда вы можете, например, переопределить реализацию Object и добавить в конструктор globalList.add(this), чтобы предотвратить сборку объектов. Это, конечно, хак, но для простого примера, возможно, достаточно.

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

8
ответ дан 30 November 2019 в 12:06
поделиться

JVM Sun не имеет такой опции. AFAIK, ни одна другая JVM не имеет этой опции.

Вы не указали, чего именно вы пытаетесь достичь, но у вас есть один из двух вариантов: либо использовать профилировщик, и точно посмотреть, что делает сборщик мусора, чтобы вы могли учесть его эффекты. Другой - скомпилировать одну из JVM из исходного кода и отключить оттуда сборку мусора.

4
ответ дан 30 November 2019 в 12:06
поделиться

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

Мой (хотя и ограниченный) опыт подсказывает мне, что VM по умолчанию чрезвычайно ленива и крайне неохотно запускает GC.

Если задать -Xmx 16384M (или что-то подобное) и убедиться, что ваш объект исследования не превышает этот предел, это может дать вам среду, которую вы хотите получить, хотя даже тогда это не будет гарантировано.

1
ответ дан 30 November 2019 в 12:06
поделиться

Можете ли вы получить JVM с открытым исходным кодом и отключить ее сборщик мусора, например Sun's Hotspot ?

Если бы не было сборки мусора, какой бы вы ожидали от семантики такого кода?

public myClass {

      public void aMethod() {

            String text = new String("xyz");

      }

}

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

Мне было бы интересно узнать больше о вашем сценарии использования.

1
ответ дан 30 November 2019 в 12:06
поделиться

Взгляните на JVM Oracle JRockit . Я видел очень хорошую, почти детерминированную производительность на оборудовании Intel с этой JVM, и вы можете управлять средой выполнения с помощью утилиты Mission Control , чтобы увидеть, насколько хорошо она работает.

Хотя вы не можете полностью отключить сборщик мусора, я считаю, что вы можете использовать параметр -Xnoclassgc , чтобы отключить сбор классов. GC можно настроить на минимизацию задержки за счет увеличения потребления памяти. Вам может потребоваться лицензия, чтобы снизить задержку до необходимого вам уровня, если вы идете по этому маршруту.

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

1
ответ дан 30 November 2019 в 12:06
поделиться

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

Самый простой вариант - не отбрасывать объекты, это позволит избежать выполнения сборки мусора (и установить очень высокий максимальный объем памяти, чтобы не закончиться).

Вы можете обнаружить, что у вас есть GC при запуске, и вы можете считать приемлемым отсутствие GC при запуске.

1
ответ дан 30 November 2019 в 12:06
поделиться

Если бы у меня была такая проблема, я бы взял Jikes Research Virtual Machine от IBM, потому что:

  • Система времени выполнения написана на самой Java (со специальными расширениями)
  • Вся эта штука была разработана как исследовательская машина и относительно легко настраивается.

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

.
0
ответ дан 30 November 2019 в 12:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: