Minecraft服务器G1 OLD触发卡顿的排查与优化咨询
排查Minecraft服务器G1 OLD频繁触发的方案
一、堆转储深度分析重点
即便未发现内存泄漏,针对区块密集型的MC场景,聚焦以下对象:
- 区块相关实例:统计
Chunk、ChunkSection、BlockEntity、Entity的内存占比与数量。若加载区块远超正常范围(90人服务器通常1000-2000块),需排查区块无法自动卸载的原因(插件锁定、视距配置漏洞)。 - 玩家关联缓存:检查
Player实例绑定的背包快照、插件附加数据、位置历史等,确认是否有大对象长期驻留老年代。 - 第三方插件对象:重点排查领地、经济、任务类插件的内存缓存,部分插件会将大量数据存于堆内存而非数据库,直接填充老年代。
- 晋升规则异常影响:当前
MaxTenuringThreshold=1会让存活1次的对象直接进入老年代,结合SurvivorRatio=32导致Survivor区极小,临时对象极易溢出到老年代,需重点统计这类临时对象的占比。
二、JVM参数针对性调整
当前参数存在几个高风险点,先做以下调整验证:
- 优化新生代与晋升逻辑:
- 将
MaxTenuringThreshold从1调整为6-8,让对象在Survivor区多经历几轮GC,减少临时对象直接进入老年代。 - 降低
SurvivorRatio至8-16,扩大Survivor区空间,避免对象过早溢出。
- 将
- 调整老年代GC触发阈值:
- 把
InitiatingHeapOccupancyPercent从20提升至40-50,降低混合GC触发频率,给G1足够时间清理老年代可回收对象。 - 将
G1MixedGCLiveThresholdPercent从90降至80,让G1更积极回收老年代中存活占比低的区块,减少内存碎片。
- 把
- 优化内存缓冲空间:
- 尝试将
G1ReservePercent从15调至20,增加老年代预留空间,避免对象晋升失败触发紧急GC。
- 尝试将
三、GC日志精细化分析
必须开启详细GC日志定位根因,添加以下参数:
-Xlog:gc*:file=gc.log:time,level,tags:filecount=5,filesize=100M
重点关注:
- G1 OLD阶段的耗时、回收内存量、老年代占比变化。
- 混合GC中老年代区块的回收比例,若回收比例极低,说明老年代多为存活对象,需回溯堆转储分析其来源。
- 晋升失败(Promotion Failure)的次数,频繁出现则说明Survivor区或老年代预留空间不足。
四、服务器场景特定排查
- 区块卸载机制验证:
- 核对
view-distance、entity-view-distance、chunk-unload-delay配置,确认区块自动卸载功能正常。使用服务器命令或插件查看当前加载区块数,若远超正常范围,排查是否有插件锁定区块导致无法卸载。
- 核对
- 插件/模组排查:
- 临时禁用非核心插件,观察GC频率是否降低,逐步定位内存消耗高的插件。
- 检查高频任务(如每秒执行)的插件,确认是否在任务中大量创建对象且未及时回收。
内容的提问来源于stack exchange,提问作者Pedro Pagani
相关产品推荐
相关产品推荐

