JVM создает объекты в стеке? (и более) - PullRequest
0 голосов
/ 28 февраля 2020

Существуют ли JVM, которые создают объекты в стеке? Или JVM, которые не взаимодействуют с Java Сборкой мусора через счетчики ссылок и т. Д. c?

Предполагается, что в методе создан временный объект. И ссылка на этот объект никогда не будет передана / сохранена / доступна вне метода. Он используется только для внутреннего использования.

При следовании классическому c подходу распределения объектов (в стеке вместе со счетчиками ссылок) необходимо выполнить следующие шаги:

  1. Найдите место в куче, достаточно большое для размещения объекта
  2. Выделите пространство
  3. Обновите указатель ссылки
  4. Зарегистрируйте объект с помощью сборки мусора
  5. [... объект используется, в конечном итоге отбрасывается ...]
  6. Определить для сборки мусора
  7. Удалить из кучи
  8. Отменить регистрацию в G C

Таким образом, если бы теперь виртуальная машина создала Объекты в стеке, шаги 1,3,4,6,7,8 не были бы необходимыми, а шаг 2 и его аналог 7i sh были бы простым стеком управление.

Так есть ли JVM, которые оптимизируют это?

Или какие-нибудь гибридные системы, такие как выделение объекта в куче, но не касание обычного G C, и вместо этого directclty удаление объекта в конце своей области?

Есть ли реализации с несколькими кучами (одна с поддержкой G C, а другая со стеком)?

1 Ответ

2 голосов
/ 28 февраля 2020

Вроде, есть проект под названием valhalla, целью которого является предоставление типов значений для java, и он может быть уже загружен и использован, но он НЕ готов к использованию (и если он будет готов, то он будет вероятно, только что слился с одним из java официальных выпусков).
Вы можете скачать раннюю версию доступа. Вы можете скачать релиз советника с https://jdk.java.net/valhalla/ и страницей о самой функции: https://openjdk.java.net/jeps/169

Дополнительные примечания: Java не использует подсчет ссылок, G C работает путем поиска root объектов, которые определенно используются, например, объектов из выполняемых в настоящее время методов, а затем находит любые другие объекты, на которые имеются ссылки из этих корней, и удаляет все остальные.

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

...