糟糕的做法

这些坏习惯可以导致内存泄漏(OutOfMemoryError)、延迟或程序行为不一致,应尽力避免。

缓存引用

某些类的实例,诸如:

不应 缓存在插件中。

其主要原因有:

  • 引用的存在会阻止垃圾回收

  • 实例可能早已失效

缓存可以通过诸如使用对应快照、保存对应的 UUID 或按需请求实时实例来避免。

主线程上的 I/O 操作

加载配置文件、加载数据、联网检查更新等 I/O 操作会相当耗时,进而严重影响服务器的 TPS。这些操作应当在独立的线程上执行,或者使用内建调度器的异步功能。但仍然有例外情况存在,比如在服务器启动或插件初始化的时候,在主线程上加载配置文件就是理所当然的。

Sponge.asyncScheduler().submit(Task.builder().execute(this::checkForUpdates).build());

关于调度器的详细说明可以参阅 其文档

不当的实现可能会导致客户端超时退出,甚至是导致 WatchDog 强行终止服务器进程。

在非主线程访问游戏对象

在非主线程上访问游戏对象可能会导致崩溃、行为不一致等各种问题,应尽可能避免。耗时长的操作应通过 调度器 来在主线程上对游戏对象进行操作。若必须要在其他线程上操作,务必使用快照对象或与独立于游戏外的数据容器。

警告

不正确的实现会导致 ConcurrentModificationException 出现,严重时会引发服务器崩溃,甚至玩家/世界/服务器数据损坏。