背景
为了给我的web项目上线,我租了一个2核2g的腾讯云服务器,上线后突发奇想能不能开一个mc服务器,让自己和朋友随时能玩我们的生存房间,而不用每次等开房的朋友。
问题
开了房之后加了十多个mod,可视距离和加载区块为1,用的java17,g1垃圾收集器默认配置,三个人同时玩,没有传送的情况下每十多秒就会出现一两次两道三秒的延迟,两个人玩没问题。
解决思路
1.用jconsole(jdk自带的图形化工具,在bin目录)查看堆的使用情况,不同gc使用的时间,结合垃圾回收机制改参数。
2.改用parallel垃圾收集器,或者串行垃圾收集器。cms在jdk14就删除了,所以就没尝试。
3.另外游戏中的优化就不赘述了。
结果
实际测试(根据朋友一起玩的体验(三个人活跃的玩),包括晚上一起打同时存在二十多只怪的地方,每五秒传送一次(传送一次大概加载9个区块))得出:
1.parallel收集器老年代基本没有增长(不触发fullgc,minorgc大概一分钟七次,主要停顿时间是10ms以内,传送的时候会有40~70ms的停顿);只有一秒传送一次这种负荷大的操作会令老年代较为快速增长(大概十分钟老年区就会满),用烟花鞘翅探图的话大概两分钟老年区就会满,从而触发fullgc(停顿10到20秒)。也就是一般强度玩,延迟能接受;高强度玩时fullgc的时候超高延时。
参数:
-XX:Xmx=1700M
-XX:Xms=1700M
-XX:+UseParallelGC
-XX:MaxTenuringThreshold=7 最大年龄;探地图到一个地方大概60s之后这些内存就会到old区,避免在survivor区里面复制来复制去浪费时间,想这些内存不到oid区就60之内离开就可以了
-Xmn400m
-XX:SurvivorRatio=8 设置survivor大小为四十mb,也就是同时存活超过40mb就进入老年代,免得复制算法消耗时间
-XX:-UseAdaptiveSizePolicy 禁用自适应对survivor和eden的大小调整才会有效,也会让-XX:TargetSurvivorRatio指令失效
-XX:PretenureSizeThreshold=1M
2.G1收集器无论怎么改参数(我尝试了一上午),几秒钟就会有一次两三秒的延迟,不是fullgc,它的好处就是mixgc,慢慢降低老年代的占用,怎么玩都不会fullgc,但平时的延迟难以接受。
实验过程
下次再写