Ошибочные решения
Этих решений следует избегать, поскольку они могут привести к утечке памяти («OutOfMemoryError»), отставанию или несоответствиям.
Storing References
Some instances such as
- and containers that MIGHT contain any of the above elements, including
Collections
Maps
should NEVER be stored or cached in plugins.
These are the main reasons for this:
The references prevent proper garbage collection
The instances might no longer be valid
Этого можно легко избежать, используя соответствующие снимки или сохраняя уникальные идентификаторы данных экземпляров, а также запрашивая живой экземпляр, когда вам это нужно.
IO on the main thread
Выполнение некоторых операций ввода-вывода, таких как загрузка файла конфигурации/данных или проверка обновлений/подключения к веб-сайту, занимает много времени и сильно влияет на TPS на сервере. Такие задачи должны выполняться либо в их собственных потоках, либо с использованием асинхронной функции встроенного планировщика. И все-таки совершенно нормально загружать необходимые файлы/конфигурации в основной поток во время запуска сервера/инициализации плагина.
this.game.getScheduler().createAsyncExecutor(this).execute(this::checkForUpdates);
For more details refer to the scheduler docs.
Если это сделано неправильно, вы можете столкнуться с перерывом в работе клиента, или сторожевой таймер может даже убить сервер.
Accessing game objects outside the main thread
Доступ к игровым объектам вне основного потока может привести к сбоям, несоответствиям и другим проблемам, которых следует избегать. Если у вас есть длинная операция в другом потоке, используйте планировщик scheduler, чтобы внести изменения в такие игровые объекты в основном потоке. Если вы хотите использовать игровой объект в другом потоке, используйте моментальный снимок экземпляра или отдельного контейнера данных.
Предупреждение
Если это сделано неправильно, вы можете получить «ConcurrentModificationException», в лучшем случае - с или без сбоев сервера, а в худшем случае - с поврежденными игроком/миром/сервером.