V2EX 前天 17:43
[程序员] 公司的游戏服务器从 java8 升级到 java21 后带来的好处和问题!
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文分享了将游戏服务器从 Java 8 升级到 Java 21 后带来的两大实际好处。首先,虚拟线程显著提升了 HTTP 服务器的性能,使得单节点能够处理更高的并发量,解决了之前需要负载均衡的问题。其次,分代 ZGC 的引入带来了更平滑、更稳定的性能,STW(Stop-The-World)停顿时间缩短至微妙级别,对游戏服务器的稳定性有巨大提升。文章还提到了升级过程中遇到的问题以及解决方案,并鼓励大家分享更多经验。

🚀 虚拟线程优化 HTTP 服务器性能:升级至 Java 21 后,虚拟线程的引入使得 HTTP 服务器能够处理更高的并发量。例如,原先 500 个线程的线程池限制了并发量,但虚拟线程消除了这一限制,只要内存和 CPU 足够,即可处理更多请求,提高了服务器的整体性能。

🌟 分代 ZGC 提升服务器稳定性:Java 21 中引入的 ZGC(Z Garbage Collector)取代了原先的 G1,极大地改善了垃圾回收的性能。ZGC 的 STW 停顿时间缩短至微妙级别,保证了游戏服务器运行的平滑和稳定,STW 停顿时间对游戏服务器的运行影响至关重要。

⚠️ 反射问题及解决方案:升级 Java 21 后,由于 Java 9 开始对权限控制更加严格,通过反射访问 private 字段可能会出现问题。文章提供了临时的解决方案,即在启动进程时添加 `--add-opens` 参数来解决反射访问问题,确保程序的正常运行。

给项目的游戏服务器从 java8 升级到了 java21 ,感觉实打实的好处有 2 个

第一个虚拟线程对 http 服务器性能的加持,有了虚拟线程,以前需要负载均衡处理来分散的并发问题,现在单节点就可以应付了。举个例子,如果原来的 http 服务线程池开 500 个线程,如果 http 处理程序中有 IO 阻塞操作,那么这个服务器的并发量就是 500 ,不能再多了。而实际上,因为是 IO 等待,服务器的 CPU 都是空闲的,但是却不能处理更多请求了,因为路就这么宽。有了虚拟线程后,这个限制就没了,来多少并发都没事,只要内存和 CPU 够就可以了。

第二个是分代 ZGC 。不能说原来的 G1 不好,但是 G1 有性能波动也是事实,STW 的时候停顿几十毫秒甚至几百毫秒还是挺常见的,对游戏服务器来说不友好。有了 ZGC ,STW 都是微妙级别了,超过 1 毫秒的都挺少,性能上很平滑稳定,对游戏服务器而言,是一个巨大的进步。

至于升级 java21 带来的问题,目前唯一碰到的恶心的问题是反射会出问题。这是由于 java9 开始对权限的控制变得严格了,原来通过反射访问 private 字段,现在需要模块导入了。作为一个临时的解决访问,在启动进程上加了,就解决了问题--add-opens=java.base/java.util=ALL-UNNAMED
--add-opens=java.base/java.lang=ALL-UNNAMED \

升级 java21 还会带来什么好处或者问题,大家也可以分享下!

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

Java 21 虚拟线程 ZGC 游戏服务器
相关文章