Активаторы JVMTI часто должны проходить кучу Java и посещать каждый живой объект ровно один раз. Один из методов состоит в вызове FollowReferences и избежать обхода данного объекта больше, чем один раз:Являются ли теги объектов, установленные JVM, видимыми для агентов JVMTI?
- Пометка каждый объект посетил с использованием SetTag и
- Фильтрация отмеченных объектов, например, установив
JVMTI_HEAP_FILTER_TAGGED
в флаги фильтра кучи.
Существует, однако, проблема при выборе подходящего значения тега. documentation для тегов объектов:
Теги местные для окружающей среды; т. е. теги одной среды не видны в другом.
Поскольку каждый агент JVMTI имеет свою собственную среду, это защищает одного агента от столкновения с тегами, установленными другим агентом. Однако в документации не указано, установлены ли теги, установленные самой JVM, например. во время сбора мусора, видны в среде JVMTI. Они видны или нет?
Если метки, установленные самим JVM , являются, агент должен избегать столкновения с любыми такими тегами, например. сначала очистив все теги или каким-то образом выбирая тег, который еще не используется.
Вы можете объяснить, почему функции [Итерации кучи] (https://docs.oracle.com/javase/8/docs/platform/jvmti/javmti.html#Heap_1_0) не подходят. Некоторые из них посещают каждый объект только один раз? –
Это не лучше, и я не хотел отвлекаться от основного вопроса. По сути, существует два набора функций. Те, которые следуют рекомендациям и поэтому могут быть использованы для поиска только живых объектов, имеют сходное поведение с «FollowReferences» и сталкиваются с проблемой тегов. Другие находят живые и мертвые объекты, чего мы не хотели. –