糟糕的做法
这些坏习惯可以导致内存泄漏(OutOfMemoryError
)、延迟或程序行为不一致,应尽力避免。
缓存引用
某些类的实例,诸如:
- 以及任何 可能 存储这些引用的容器,包括:
Collection
Map
不应 缓存在插件中。
其主要原因有:
引用的存在会阻止垃圾回收
实例可能早已失效
缓存可以通过诸如使用对应快照、保存对应的 UUID 或按需请求实时实例来避免。
主线程上的 I/O 操作
加载配置文件、加载数据、联网检查更新等 I/O 操作会相当耗时,进而严重影响服务器的 TPS。这些操作应当在独立的线程上执行,或者使用内建调度器的异步功能。但仍然有例外情况存在,比如在服务器启动或插件初始化的时候,在主线程上加载配置文件就是理所当然的。
this.game.getScheduler().createAsyncExecutor(this).execute(this::checkForUpdates);
关于调度器的详细说明可以参阅 其文档。
不当的实现可能会导致客户端超时退出,甚至是导致 WatchDog 强行终止服务器进程。
在非主线程访问游戏对象
在非主线程上访问游戏对象可能会导致崩溃、行为不一致等各种问题,应尽可能避免。耗时长的操作应通过 调度器 来在主线程上对游戏对象进行操作。若必须要在其他线程上操作,务必使用快照对象或与独立于游戏外的数据容器。
警告
不正确的实现会导致 ConcurrentModificationException
出现,严重时会引发服务器崩溃,甚至玩家/世界/服务器数据损坏。