MC性能监视器

起因是要给一个MC服务器的官网添加显示服务器状态的功能,于是写了一个Mod,用于监控TPS,MSPT和系统资源情况等。

实现思路

关于MTPS和TPS的实现参考了TabTPS,其对于MinecraftServer类的注入和状态机设计很好的实现了对于TPS和MSTP的高精度记录

至于系统资源的情况,由于Java没有实现固定的接口用于获取主机的内存情况,在这里使用了Oracle JDK提供的com.sun.management.OperatingSystemMXBean获取,按秒获得CPU,内存等的使用情况,随后每分钟计算平均发送给api服务器,同时提供接口发送这一秒的精确情况

在数据传输的协议上,MC服务器作为客户端连接到api服务器,使用WebSocket协议。

在线程管理上,为了防止干扰MC主线程的运行,所有数据利用volatile关键字保证可见性,由于数据只有一个线程写入,无需写入锁。用于传输监控数据的 SystemStats 类被设计为不可变对象,其所有字段均使用 final 修饰。配合 volatile 引用,这种设计确保了数据在跨线程传递时的安全,读取线程永远不会看到部分构造的对象。

对于玩家列表的更新,注册了ServerPlayerEvents.JOINServerPlayerEvents.LEAVE两个事件维护一个CopyOnWriteArrayList,当服务器收到get_players指令时会先防御性复制再序列化,保证了不会出现数据撕裂。

隔离了MC主线程与WebSocket进程,同时对于心跳包兼状态固定汇报,与获取系统状态利用Scheduler进行多线程管理,创建了lock_clientlock_schedule两个锁,分别管理对于WebSocket客户端的操作和对于schedul的操作,同时严格遵循lock_schedule在前,lock_client在后,防止死锁

项目地址