modsmith Войти Войти Рус / Eng

Jasione

jasione · 255379 загрузок · LGPL-3.0-only

клиент: optional · сервер: optional (заявлено автором мода)

Уменьшите нагрузку на сборщик мусора, безопасно исключив клонирование массива Enum#values ​​и накладные расходы на выделение памяти посредством анализа байт-кода.

Описание

Джейсион

Обзор

Jasione — это мод оптимизации, который уменьшает выделение памяти (давление GC).

Компилятор Java генерирует для каждого класса перечисления метод values(), который можно использовать для получения всех значений перечисления в виде массива. Этот метод клонирует массив перед его возвратом, гарантируя, что вызывающие этот метод могут безопасно изменять массив, не затрагивая других вызывающих. Однако это влечет за собой снижение производительности. При вызове по горячим путям эти небольшие выделения памяти накапливаются и увеличивают нагрузку на сборщик мусора.

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-компилятор в настоящее время не распознает даже самые тривиальные шаблоны использования, такие как перебор массива значений. Накладные расходы на клонирование и выделение памяти сохраняются, согласно JMHtests.

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, это сообщение, по сути, подталкивает авторов модов определить, необходим ли такой вариант использования. Для Ясионе эта трансформация необходима. (см. предыдущий вопрос)

Для справки см. обсуждение на сервере Discord «The NeoForged Project» (обратите внимание, что в обсуждении участвовали различные реализации, которые не стали окончательной версией из-за различных проблем. Более подробную информацию см. в разделе «Технические детали»).

Технические подробности

Контракт Enum#values (где Enum относится к любому классу перечисления) заключается в том, что возвращаемый массив является свежим и может свободно изменяться. Поэтому мы должны определить, какие вызывающие программы безопасно оптимизировать, анализируя, изменяют ли они массив или экранируют массив. Это стало возможным благодаря использованию библиотеки asm-analysis. Если мутация массива или escape-символы обнаружены с помощью анализа байт-кода, вызов остается неизменным, чтобы сохранить корректность.

Нам нужно найти место для хранения массива кэшированных значений, поскольку синтетическое поле $VALUES для перечисляемых классов является закрытым. Текущая реализация выполняет генерацию классов во время выполнения. Для каждого класса перечисления создается соответствующий класс держателя кэша для хранения массива значений в виде поля static final. Например, когда преобразователь впервые обнаруживает использование net.minecraft.core.Direction#values, он генерирует класс me.decce.jasione.cached.net.minecraft.core.Direction, который содержит массив кэшированных значений и различные другие метаданные для обеспечения корректности. Благодаря этому он может преобразовать всех вызывающих исходный метод values() для использования кэшированного класса.

Версии (60)

ВерсияMinecraftЗагрузчикиФайл
1.0.9+26.1.2-neoforge 26.1, 26.1.1, 26.1.2, 26.2, 26.3 neoforge скачать
1.0.9+26.1.2-fabric 26.1, 26.1.1, 26.1.2, 26.2, 26.3 fabric, quilt скачать
1.0.9+1.21.11-neoforge 1.21.10, 1.21.11 neoforge скачать
1.0.9+1.21.11-fabric 1.20.5, 1.20.6, 1.21, 1.21.1, 1.21.10, 1.21.11, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9 fabric, quilt скачать
1.0.9+1.21.1-neoforge 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8 neoforge скачать
1.0.9+1.20.1-forge 1.19, 1.19.1, 1.19.2, 1.19.3, 1.19.4, 1.20, 1.20.1, 1.20.2, 1.20.3, 1.20.4, 1.20.5, 1.20.6 forge скачать
1.0.9+1.20.1-fabric 1.18.2, 1.19, 1.19.1, 1.19.2, 1.19.3, 1.19.4, 1.20, 1.20.1, 1.20.2, 1.20.3, 1.20.4 fabric, quilt скачать
1.0.9+1.18.2-forge 1.18.2 forge скачать
1.0.8+26.1.2-neoforge 26.1, 26.1.1, 26.1.2, 26.2, 26.3 neoforge скачать
1.0.8+26.1.2-fabric 26.1, 26.1.1, 26.1.2, 26.2, 26.3 fabric, quilt скачать
1.0.8+1.21.11-neoforge 1.21.10, 1.21.11 neoforge скачать
1.0.8+1.21.11-fabric 1.20.5, 1.20.6, 1.21, 1.21.1, 1.21.10, 1.21.11, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9 fabric, quilt скачать
1.0.8+1.21.1-neoforge 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8 neoforge скачать
1.0.8+1.20.1-forge 1.19, 1.19.1, 1.19.2, 1.19.3, 1.19.4, 1.20, 1.20.1, 1.20.2, 1.20.3, 1.20.4, 1.20.5, 1.20.6 forge скачать
1.0.8+1.20.1-fabric 1.18.2, 1.19, 1.19.1, 1.19.2, 1.19.3, 1.19.4, 1.20, 1.20.1, 1.20.2, 1.20.3, 1.20.4 fabric, quilt скачать
1.0.8+1.18.2-forge 1.18.2 forge скачать
1.0.7+26.1.2-neoforge 26.1, 26.1.1, 26.1.2, 26.2 neoforge скачать
1.0.7+26.1.2-fabric 26.1, 26.1.1, 26.1.2, 26.2 fabric, quilt скачать
1.0.7+1.21.11-neoforge 1.21.10, 1.21.11 neoforge скачать
1.0.7+1.21.11-fabric 1.20.5, 1.20.6, 1.21, 1.21.1, 1.21.10, 1.21.11, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9 fabric, quilt скачать
1.0.7+1.21.1-neoforge 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8 neoforge скачать
1.0.7+1.20.1-forge 1.19, 1.19.1, 1.19.2, 1.19.3, 1.19.4, 1.20, 1.20.1, 1.20.2, 1.20.3, 1.20.4, 1.20.5, 1.20.6 forge скачать
1.0.7+1.20.1-fabric 1.18.2, 1.19, 1.19.1, 1.19.2, 1.19.3, 1.19.4, 1.20, 1.20.1, 1.20.2, 1.20.3, 1.20.4 fabric, quilt скачать
1.0.7+1.18.2-forge 1.18.2 forge скачать
1.0.6+26.1.2-neoforge 26.1, 26.1.1, 26.1.2, 26.2 neoforge скачать
1.0.6+26.1.2-fabric 26.1, 26.1.1, 26.1.2, 26.2 fabric, quilt скачать
1.0.6+1.21.11-neoforge 1.21.10, 1.21.11 neoforge скачать
1.0.6+1.21.11-fabric 1.20.5, 1.20.6, 1.21, 1.21.1, 1.21.10, 1.21.11, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9 fabric, quilt скачать
1.0.6+1.21.1-neoforge 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8 neoforge скачать
1.0.6+1.20.1-forge 1.19, 1.19.1, 1.19.2, 1.19.3, 1.19.4, 1.20, 1.20.1, 1.20.2, 1.20.3, 1.20.4, 1.20.5, 1.20.6 forge скачать
1.0.6+1.20.1-fabric 1.18.2, 1.19, 1.19.1, 1.19.2, 1.19.3, 1.19.4, 1.20, 1.20.1, 1.20.2, 1.20.3, 1.20.4 fabric, quilt скачать
1.0.6+1.18.2-forge 1.18.2 forge скачать
1.0.5+26.1.2-neoforge 26.1, 26.1.1, 26.1.2, 26.2 neoforge скачать
1.0.5+26.1.2-fabric 26.1, 26.1.1, 26.1.2, 26.2 fabric, quilt скачать
1.0.5+1.21.11-neoforge 1.21.10, 1.21.11 neoforge скачать
1.0.5+1.21.11-fabric 1.20.5, 1.20.6, 1.21, 1.21.1, 1.21.10, 1.21.11, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9 fabric, quilt скачать
1.0.5+1.21.1-neoforge 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8 neoforge скачать
1.0.5+1.20.1-forge 1.19, 1.19.1, 1.19.2, 1.19.3, 1.19.4, 1.20, 1.20.1, 1.20.2, 1.20.3, 1.20.4, 1.20.5, 1.20.6 forge скачать
1.0.5+1.20.1-fabric 1.18.2, 1.19, 1.19.1, 1.19.2, 1.19.3, 1.19.4, 1.20, 1.20.1, 1.20.2, 1.20.3, 1.20.4 fabric, quilt скачать
1.0.5+1.18.2-forge 1.18.2 forge скачать
1.0.4+26.1.2-neoforge 26.1, 26.1.1, 26.1.2, 26.2 neoforge скачать
1.0.4+26.1.2-fabric 26.1, 26.1.1, 26.1.2, 26.2 fabric, quilt скачать
1.0.4+1.21.11-neoforge 1.21.10, 1.21.11 neoforge скачать
1.0.4+1.18.2-forge 1.18.2 forge скачать
1.0.4+1.21.11-fabric 1.18.2, 1.19, 1.19.1, 1.19.2, 1.19.3, 1.19.4, 1.20, 1.20.1, 1.20.2, 1.20.3, 1.20.4, 1.20.5, 1.20.6, 1.21, 1.21.1, 1.21.10, 1.21.11, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9 fabric, quilt скачать
1.0.4+1.21.1-neoforge 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8 neoforge скачать
1.0.4+1.20.1-forge 1.19, 1.19.1, 1.19.2, 1.19.3, 1.19.4, 1.20, 1.20.1, 1.20.2, 1.20.3, 1.20.4, 1.20.5, 1.20.6 forge скачать
1.0.3+26.1.2-neoforge 26.1, 26.1.1, 26.1.2, 26.2 neoforge скачать
1.0.3+26.1.2-fabric 26.1, 26.1.1, 26.1.2, 26.2 fabric, quilt скачать
1.0.3+1.21.11-neoforge 1.21.10, 1.21.11 neoforge скачать
1.0.3+1.21.11-fabric 1.20.1, 1.20.2, 1.20.3, 1.20.4, 1.20.5, 1.20.6, 1.21, 1.21.1, 1.21.10, 1.21.11, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9 fabric, quilt скачать
1.0.3+1.21.1-neoforge 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8 neoforge скачать
1.0.3+1.20.1-forge 1.20.1 forge скачать
1.0.2+26.1.2-neoforge 26.1, 26.1.1, 26.1.2, 26.2 neoforge скачать
1.0.2+26.1.2-fabric 26.1, 26.1.1, 26.1.2, 26.2 fabric, quilt скачать
1.0.2+1.21.11-neoforge 1.21.10, 1.21.11 neoforge скачать
1.0.2+1.21.11-fabric 1.20.1, 1.20.2, 1.20.3, 1.20.4, 1.20.5, 1.20.6, 1.21, 1.21.1, 1.21.10, 1.21.11, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9 fabric, quilt скачать
1.0.2+1.21.1-neoforge 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8 neoforge скачать
1.0.2+1.20.1-forge 1.20.1 forge скачать
1.0.1+26.1.2-neoforge 26.1, 26.1.1, 26.1.2, 26.2 neoforge скачать

Страница на Modrinth →