Объекты предварительно извлекаются из массива ссылок в Java?

Представьте, что у нас есть 1000 объектов одного типа, разбросанных по памяти (они были созданы в разное время, а между ними были созданы другие объекты).

У нас есть массив, который содержит ссылки на каждый из 1000 объектов.

Вопрос

Если мы будем перебирать массив последовательно, что будет предварительно загружено в кеш процессора? Только ссылки, содержащиеся в массиве, или эти ссылки будут разыменованы, а объекты также загружены в кеш?

Реализует ли Java (JVM) какую-то предварительную выборку программного обеспечения? Если нет, существуют ли библиотеки, обеспечивающие предварительную выборку программного обеспечения?


person PaperTsar    schedule 05.07.2015    source источник
comment
Звучит так, как будто это будет специфично для реализации. Я также твердо уверен, что это зависит от программного обеспечения, так как упорядочение памяти может повлиять на такие вещи. Хотя в последней части могу ошибаться.   -  person Dioxin    schedule 05.07.2015
comment
Я почти уверен, что кеш процессора на 100% контролируется оборудованием. Возможно, когда работает сборщик мусора, он объединяет ваши 1000 объектов в общую область памяти. Однако ничто из того, что я читал, не указывает на то, что любой GC делает это. Аппаратные кэши в любом случае обычно заполнены важными данными, любой предварительный кэш ограничен одной строкой кэша, обычно около 32-16 байт.   -  person markspace    schedule 05.07.2015
comment
Куча делится на молодое и старое пространство. В молодом пространстве есть недавно выделенные объекты. Когда эти объекты стареют, они перемещаются в старую область. Хранилище - это место недавно выделенных объектов, которые перемещаются быстро и не должны быть мусором. собрал.   -  person joey rohan    schedule 05.07.2015
comment
Я не думаю, что какой-либо ЦП предварительно выбирает ссылки. Это не имело бы смысла, потому что если размер вашего объекта в байтах по модулю 64 (строки кеша обычно длиной 64 байта) относительно мал , вы теряете много кеша (что в целом может замедлить работу вашей программы). Более того, ЦП должен будет проанализировать ваш код, чтобы увидеть, действительно ли вы используете объект, стоящий за ссылкой, или только ссылку (имейте в виду, что один и тот же ЦП может выполнять код C/C++).   -  person Turing85    schedule 05.07.2015
comment
Неа. И это серьезная проблема с производительностью для Java. И именно поэтому они пытаются добавить типы значений в java9 (или более позднюю версию), чтобы массив вещей располагался в одной области памяти.   -  person ZhongYu    schedule 05.07.2015
comment
Между тем, если вас действительно волнует этот вопрос, вы можете кое-что сделать сами; наиболее примитивно используйте byte[] для хранения всех ваших данных :)   -  person ZhongYu    schedule 06.07.2015


Ответы (1)


После некоторых исследований наиболее распространенная реализация JVM (HotSpot) использовалась для поддерживает предварительную выборку. Но это было удалено, так как от них нет практической пользы. Спасибо @apangin за ссылку на отчет об ошибке.

Как упоминалось в @markspace, объекты переупорядочиваются для облегчения доступа во время сбора — это называется уплотнением и присутствует в сборщике мусора по умолчанию, используемом HotSpot. Вам не нужно беспокоиться о таких базовых деталях, так как виртуальная машина сделает это за вас.

Чуть глубже в уплотнение..

Вы, наверное, слышали об Stop-The-World — это происходит, когда граф объектов находится в несогласованном состоянии. Объекты перемещаются, поэтому поток может получить доступ к объекту, которого больше нет. Некоторые реализации GC считаются безостановочными, например Shenandoah GC, которые используют указатель переадресации, чтобы позволить потоку получить доступ к недавно перемещенному объекту.

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

Окончательный ответ

Итак, объекты предварительно выбираются из массива ссылок? Не стоит об этом беспокоиться. Вы используете Java, чтобы не заботиться об этих базовых деталях.

Если вы ДЕЙСТВИТЕЛЬНО заинтересованы в таких деталях (возможно, вы столкнулись с какой-то странной ошибкой), как я упоминал ранее, это зависит от реализации, и вам нужно уточнить, о какой реализации вы говорите.

Хотя, как я уже говорил, это Java; перестаньте беспокоиться о вещах, о которых вам не нужно беспокоиться. Я не могу не подчеркнуть это достаточно.

person Dioxin    schedule 05.07.2015
comment
Согласованный. Суть Java в том, что вам (в большинстве случаев) не нужно заботиться о таких низкоуровневых деталях; JIT обучается на опыте тысяч проектов и людей, чтобы сделать код Java эффективным. Время и усилия, вложенные в одном месте, высвобождают умственные способности миллионов разработчиков. - person Aaron Digulla; 06.07.2015
comment
Я ответил здесь о поддержке предварительной выборки в HotSpot JVM. Однако недавно эти встроенные функции были полностью удалены из репозитория разработки HotSpot на том основании, что они не имеют практического применения. - person apangin; 06.07.2015
comment
@apangin Имеет смысл. У вас есть ссылка на источник этой информации? Или это не документировано? - person Dioxin; 06.07.2015
comment
Вот соответствующая ссылка на ошибку. - person apangin; 06.07.2015