ПО, ЭВМ и АСУ из Таможенного Союза

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



GC-safe point

Сообщений 1 страница 9 из 9

1

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

Вот здесь москвич Алексей Рогозин рассказывает об этом ясным английским языком:
http://blog.ragozin.info/2012/10/safepo … t-jvm.html

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

Safepoint status check itself is implemented in very cunning way. Normal memory variable check would require expensive memory barriers. Though, safepoint check is implemented as memory reads a barrier. Then safepoint is required, JVM unmaps page with that address provoking page fault on application thread (which is handled by JVM’s handler). This way, HotSpot maintains its JITed code CPU pipeline friendly, yet ensures correct memory semantic (page unmap is forcing memory barrier to processing cores).

when reaching the safepoint check, the thread will check if the safepoint is required (e.g. FullGC is scheduled), if yes, then the thread blocks.

Azul is using custom page mapping to facilitate software read barrier, but this technique does not rely on page faults.

Не могу перевести (т.е. перевод ясен, но смысл ускользает, потому что я не знаю, что такое "custom page mapping")

0

2

Лис написал(а):

A point during program execution at which all GC roots are known and all heap object contents are consistent. From a global point of view, all threads must block at a safepoint before the GC can run.

Тут мне не очень ясна фраза насчёт того, что именно должно произойти, чтобы все начальные узлы стали известны. Нужно выгрузить все значения из регистров? И как проверяют консистентность объектов на куче.

0

3

Но "москвич Алексей Рагозин" рассказывает об этом "ясным английским языком"...  :rofl: )))

0

4

Лис написал(а):

custom page mapping

речь о

Лис написал(а):

safepoint is required, JVM unmaps page with that address provoking page fault on application thread

Отредактировано atz (2017-07-15 23:52:58)

0

5

Гугл перевёл так:
Azul использует настраиваемое сопоставление страниц для облегчения чтения программного обеспечения, но этот метод не зависит от ошибок страницы.
Скорее всего - "но этот метод не предохраняет от ошибок на самой странице"

0

6

Сандро написал(а):

Скорее всего - "но этот метод не предохраняет от ошибок на самой странице"

Сандро, всё было не так. Во-первых, там цитаты от двух разных алгоритмов, и не факт, что они работают одинаково. Это надо перепроверить по первоисточникам. Во-вторых, я думаю что переводить надо так:

Если бы поток считывал значение из ячейки памяти, то нужно было бы выполнить дополнительно инструкцию барьера, гарантирующую, что все другие потоки, ядра и процессоры сбросили свои кеши (таким образом, чтобы не получилось "грязного чтения" этой ячейки). Организация "барьера" - это дорогая операция, затрагивающая много логических цепей, поэтому вместо чтения значения из ячейки используют факт обращения к ячейке памяти, расположенной на отдельной странице. Это такая специально сделанная страница, номер которой учитывается особо.

И вот, когда нить сборки мусора решает, что мусор пора собирать, ту специально сделанную страницу помечают как недоступную. Все другие нити, когда доходят каждая до своей GC-safe point обращаются к той странице и переключаются ядрами на обработчик прерывания "отсутствующая страница".

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

Сандро, я прошу Вас как знатока по ассемблеру, написать демонстрационный пример для такого сценария. Думаю месяца за три-четыре это можно сделать. (мы всё равно уже потратили почти год с момента публикации лисоплана, так что 4 месяца это немного). У Вас есть целая wiki по ассемблеру, ни у кого больше такой нет. Кого мне ещё просить?

0

7

- Ого!... Да если бы я научился писать на ассемблере... - Не, даже представить боюсь...  :huh: )))
Однако с каждым утекающим днём я всё меньше верю в тот светлый миг, когда смогу написать нечто стоящее, но на своём, родном для меня языке и оно "с пол-тычка" заработает, ведь "первый блин комом" - это не про меня...

0

8

Лис написал(а):

вместо чтения значения из ячейки используют факт обращения

Именно так, но так как страница отсутствует в памяти (отмонтирована), вызывается обработчик, а дальше делаем что нужно.
Принципиально реализовать такое несложно (делать этого я конечно же не буду): VirtualAlloc & VirtualFree (или их аналоги в линупсе) + обработчик исключений. Ассемблер тут не при чём.

0

9

atz написал(а):

делать этого я конечно же не буду

публикуй твоё видение того, что нужно делать на самом деле, обсудим.

0