Jasione
Снижаем нагрузку на GC, безопасно устраняя клонирование массива Enum#values и накладные расходы на выделение памяти с помощью анализа байт-кода
- Загрузчики
- FabricNeoForgeForgeQuilt
- Скачиваний на Modrinth
- 329 тыс.
- Подписчиков на Modrinth
- 62
- версия
- 71
- Обновлён
- 2 октября 20262 окт.
- Опубликован
- в 2026
Коротко о моде
Работает и в игре, и на сервере — ставьте, где нужен
Jasione
Обзор
Jasione — это мод-оптимизация, снижающий выделение памяти (нагрузку на GC).
Компилятор Java для каждого класса-перечисления генерирует метод values(), который можно использовать для получения всех значений перечисления в виде массива. Этот метод клонирует массив перед возвратом, гарантируя, что вызывающие этот метод могут безопасно изменять массив, не влияя на других вызывающих. Однако это создаёт накладные расходы на производительность. При вызове в горячих путях эти небольшие выделения памяти накапливаются и увеличивают нагрузку на GC.
Jasione решает эту проблему, перенаправляя вызовы values(), которые не изменяют возвращаемый массив, на использование кэша, устраняя накладные расходы на клонирование и выделение памяти. Подробности о том, как это реализовано безопасно, см. в разделе «Технические детали» ниже.
Конфигурация
В настоящее время Jasione предлагает несколько отладочных опций, которые можно использовать для проверки результата оптимизации. Конфигурация находится в config/jasione.toml.
#Specifies whether to enable the mod
enabled = true
[debug]
#When enabled, logs statistics when optimizations are applied
printOptimization = false
#When enabled, dumps transformed classes to the ".jasione.out" folder
dumpClasses = falseЧасто задаваемые вопросы
Разве JIT не оптимизирует вызовы Enum#values(), когда они безопасны?
Нет, компилятор JIT в настоящее время не распознаёт даже самые тривиальные шаблоны использования, такие как итерация по массиву значений. Накладные расходы на клонирование и выделение памяти сохраняются, согласно тестам JMH.
NeoForge отображает предупреждение об этом моде. Почему?
При запуске этого мода на последней версии NeoForge (1.21.11+) вы можете столкнуться с этим предупреждением:
[Render thread/ERROR] [ne.ne.fm.cl.tr.ClassTransformStatistics/]: Class processor jasione:main transformed 100.00% of loaded class which is suspiciously high; it may be attempting mass-ASM. Please report this to the mod author.По словам членов команды NeoForge, это сообщение по сути служит напоминанием для авторов модов, чтобы определить, необходима ли такая реализация. Для Jasione эта трансформация необходима. (См. предыдущий вопрос)
Для справки см. обсуждение на discord-сервере «The NeoForged Project» (учтите, что в обсуждении рассматривались другие реализации, которые не стали финальной версией из-за различных проблем. Подробнее см. в разделе «Технические детали».)
Технические детали
Контракт Enum#values (где Enum относится к любому классу-перечислению) заключается в том, что возвращаемый массив является новым и может свободно изменяться. Поэтому мы должны определить, какие вызывающие безопасно оптимизировать, анализируя, изменяют ли они массив или массив «утекает». Это стало возможным благодаря использованию библиотеки asm-analysis. Если анализ байт-кода обнаруживает изменение массива или его «утечку», вызов остаётся неизменным для сохранения корректности.
Нам нужно найти место для хранения кэшированного массива значений, поскольку синтетическое поле $VALUES для классов-перечислений является приватным. Текущая реализация выполняет генерацию классов во время выполнения. Для каждого класса-перечисления генерируется соответствующий класс-держатель кэша для хранения массива значений в виде поля static final. Например, когда трансформер впервые обнаруживает использование net.minecraft.core.Direction#values, он генерирует класс me.decce.jasione.cached.net.minecraft.core.Direction, который хранит кэшированный массив значений и различные другие метаданные для обеспечения корректности. Благодаря этому он может преобразовать всех вызывающих оригинального метода values() для использования кэшированного класса.
Частые вопросы
Как установить Jasione?
Установите Fabric под свою версию Minecraft, скачайте Jasione под ту же версию и загрузчик, положите файл в папку mods и запустите игру с профилем загрузчика.
Для каких версий Minecraft есть Jasione?
У Jasione есть сборки для Minecraft 1.18.2–26.3.
Нужен ли Jasione на сервере?
Работает и в игре, и на сервере — ставьте, где нужен