本帖最后由 TSStudio 于 2022-5-28 10:27 编辑
已解决,原因如下:
build.gradle 原来为
复制代码改为
复制代码即可(混淆顺序问题)
原问题:
事情是这样的:我开发了一个 fabric mod(Minecraft版本1.18.2),大致功能为监听复制代码事件,当触发时,将玩家名称发送 GET 请求到 HTTP 服务器,若返回 true 则什么也不做,若返回其他值,则
复制代码mod的编译一切正常。放到本地(Windows10 x64,Oracle JDK 17.0.2,mod内容与下述服务器相同)的服务器上运行时,一切正常,服务器性能没有任何影响,而mod功能也正常可用。但是一旦放到服务器(阿里云 Ubuntu18.04 x64 4G内存 OracleJDK 17.0.2)时,就出现以下情况:
服务器加载阶段,mod能够输出 onInitialize 中的 LOG 信息。
服务器加载完成(即地图加载完成后)也正常,没有任何影响。
一旦有客户端刷新motd信息(即获取图标和服务器简介时)就会开始卡顿(未进入服务器,即该mod的所有代码实际上并没有执行),表现为 CPU 单核满载,但内存占用不高。大多数时候会被 Linux 系统 Kill 掉,但有一次是被 Watchdog 产生了崩溃报告的(宝贵的crash-report)。
crash-report 如下:
mod 核心代码如下
注:引用了 org.apache.httpcomponents:httpclient 包,使用 shadowJar 生成胖 Jar。
一些细节(或许有助于解决问题,此处将会产生卡死的服务器称为服务器2):
1.服务器2 在不获取motd的情况下直接进入是可行的,mod效果正常可用,但进入10秒左右就会开始卡顿。
2.org.apache.httpcomponents:httpclient 也引用了 org.apache.commons 包,在不封入后者的情况下,在本地运行会直接崩溃提示 classNoDef,而在服务器2不会报错,出现上述卡死现象。
已解决,原因如下:
build.gradle 原来为
- remapJar{
- dependsOn shadowJar
- input.set shadowJar.archiveFile.get()
- }
- prepareRemapJar {
- dependsOn shadowJar
- }
- remapJar{
- input.set shadowJar.archiveFile.get()
- }
原问题:
事情是这样的:我开发了一个 fabric mod(Minecraft版本1.18.2),大致功能为监听
- ServerPlayConnectionEvents.JOIN
- player.networkHandler.disconnect(reason);
服务器加载阶段,mod能够输出 onInitialize 中的 LOG 信息。
服务器加载完成(即地图加载完成后)也正常,没有任何影响。
一旦有客户端刷新motd信息(即获取图标和服务器简介时)就会开始卡顿(未进入服务器,即该mod的所有代码实际上并没有执行),表现为 CPU 单核满载,但内存占用不高。大多数时候会被 Linux 系统 Kill 掉,但有一次是被 Watchdog 产生了崩溃报告的(宝贵的crash-report)。
crash-report 如下:
|
mod 核心代码如下
|
注:引用了 org.apache.httpcomponents:httpclient 包,使用 shadowJar 生成胖 Jar。
一些细节(或许有助于解决问题,此处将会产生卡死的服务器称为服务器2):
1.服务器2 在不获取motd的情况下直接进入是可行的,mod效果正常可用,但进入10秒左右就会开始卡顿。
2.org.apache.httpcomponents:httpclient 也引用了 org.apache.commons 包,在不封入后者的情况下,在本地运行会直接崩溃提示 classNoDef,而在服务器2不会报错,出现上述卡死现象。
能想到的原因是同步网络IO阻塞了主线程
亦或是某些地方出现了无限递归
导致 Watchdog 错误
试试用 VisualVM 等分析工具分析性能,找到哪里开销大
另外如果单纯的一个Get请求
jdk自带的net包就差不多了,不用再引用一个外部库了
亦或是某些地方出现了无限递归
导致 Watchdog 错误
试试用 VisualVM 等分析工具分析性能,找到哪里开销大
另外如果单纯的一个Get请求

jdk自带的net包就差不多了,不用再引用一个外部库了
美味的曲奇 发表于 2022-5-28 08:29
能想到的原因是同步网络IO阻塞了主线程
亦或是某些地方出现了无限递归
导致 Watchdog 错误
理论上这些代码都没执行过
我能想到的就是可能我引用的包里的东西 把原版的包里的方法给替换了 且可能是linux独有的问题
稍后我将:1.在本地开一个ubuntu试一试。2.将apache的http换成net
TSStudio 发表于 2022-5-28 08:38
理论上这些代码都没执行过
我能想到的就是可能我引用的包里的东西 把原版的包里的方法给替换了 且可能是li ...
不用怀疑,服务端本身有 org.apache.httpcomponents:httpclient
插件如果二次加载一定会有覆盖关系
会导致什么问题就不清楚了
所以如果只是发送Get请求最好用 java.net 包

能少引用一个外部包就省一个依赖处理