首页 > 默认 > HZERO PaaS平台组装笔记十五-使用IBM OpenJDK_OpenJ9

HZERO PaaS平台组装笔记十五-使用IBM OpenJDK_OpenJ9

2025年12月30日


有同事告诉我换个jdk,使用IBM OpenJDK_OpenJ9(内置OpenJ9 JVM),不仅可以大幅减少内存使用,还可以大幅加快启动速度。

那我们就来实验一下。

一、WSL中jar方式运行微服务,替换成ibm OpenJDK_OpenJ9(内置openJ9 JVM)

Windows PowShell中

#关闭虚拟机

$ wsl –shutdown

#从备份新建虚拟机实例

$ wsl –import Ubuntu-2204-hzero-openjdk D:\wsl\Ubuntu-2204-hzero-openjdk D:\wsl\Ubuntu-22.04-hzero-backup20251225.tar –version 2

#查看导入新建结果

$ wsl –list –verbose 

下载openj9-jdk

Semeru Runtime Downloads – IBM Developer

同事说要下载 java17 的0.53版的JDK,他测试过0.56版不稳定。

打开Ubuntu-2204-hzero-openjdk虚拟机

#创建目录

$ mkdir -p /d02/openjdk

#拷贝下载的jdk到虚拟机(powshell中):

$ cp C:\Users\A\Downloads\ibm-semeru-open-jdk_x64_linux_17.0.16_8_openj9-0.53.0.tar.gz  \\wsl.localhost\Ubuntu-2204-hzero-openjdk\d02\openjdk\

#解压缩

$ tar -zxvf ibm-semeru-open-jdk_x64_linux_17.0.16_8_openj9-0.53.0.tar.gz

# 注册java命令(优先级100,确保优先使用) sudo update-alternatives –install /usr/bin/java java /d02/openjdk/jdk-17.0.16+8/bin/java 100

# 注册javac命令(JDK开发工具,必须配置) sudo update-alternatives –install /usr/bin/javac javac /d02/openjdk/jdk-17.0.16+8/bin/javac 100

# 配置默认java

sudo update-alternatives –config java

# 配置默认javac

sudo update-alternatives –config javac

# 编辑用户环境变量文件 nano ~/.bashrc

# 在文件末尾添加以下内容(直接复制,路径已匹配)

export JAVA_HOME=/d02/openjdk/jdk-17.0.16+8

export PATH=$JAVA_HOME/bin:$PATH

#使配置立即生效

source ~/.bashrc

#执行以下命令,输出版本为 17.0.16 即说明配置完成:

# 验证java版本 java -version

# 验证javac版本(确认JDK生效,而非仅JRE) javac -version

# 验证JAVA_HOME(输出/d02/openjdk/jdk-17.0.16+8) echo $JAVA_HOME

$ java –version

openjdk 17.0.16 2025-07-15

IBM Semeru Runtime Open Edition 17.0.16.0 (build 17.0.16+8)

Eclipse OpenJ9 VM 17.0.16.0 (build openj9-0.53.0, JRE 17 Linux amd64-64-Bit Compressed References 20250715_1115 (JIT enabled, AOT enabled)

OpenJ9   – 017819f167

OMR      – 266a8c6f5

JCL      – 34b4be01e57 based on jdk-17.0.16+8)

$ javac -version

javac 17.0.16

$ echo $JAVA_HOME

/d02/openjdk/jdk-17.0.16+8

配置完成后,是否需要重新构建jar?

我原来用的是:

download.oracle.com/otn/java/jdk/17.0.15%2B9/4f092786cec841d58ae21840b10204d7/jdk-17.0.15_linux-x64_bin.tar.gz

现在换成了:

github.com/ibmruntimes/semeru17-binaries/releases/download/jdk-17.0.16%2B8_openj9-0.53.0/ibm-semeru-open-jdk_x64_linux_17.0.16_8_openj9-0.53.0.tar.gz

豆包回答不需要,这次是 同大版本(JDK 17)下的不同发行版更换:从 Oracle JDK 17.0.15 换成 IBM Semeru OpenJDK 17.0.16(带 OpenJ9 虚拟机),这种情况完全不需要重新打包 Jar 包,直接运行即可。

按照同事建议把启动命令所有服务的run_nobuild.sh中min内存设置到128,max保持原来不变。

#启动AI平台服务WSL的30G内存只消耗了17G;

free
total used free shared buff/cache available
Mem: 30802096 17835312 8845568 4624 4121216 12614252
Swap: 8388608 1353216 7035392

再启动低代码3个服务和流程平台1个服务之后,内存消耗增加到21G:

free
total used free shared buff/cache available
Mem: 30802096 21955264 4002200 4632 4844632 8487744
Swap: 8388608 1353216 7035392

再启动集成平台2个服务之后,内存消耗增加到23G

free
total used free shared buff/cache available
Mem: 30802096 23421660 2250812 4632 5129624 7020308
Swap: 8388608 1353216 7035392

而如果使用Oracle的 JDK,但启动AI平台服务就消耗了29G内存,基本把我的WSL虚拟机分配的内存消耗完了,(备注:使用Oracle JDK的WSL虚拟机中所有服务的run_nobuild.sh中min内存也都是设置到128的)。

Oracle JDK,但启动AI平台服务的情况:

$ free
total used free shared buff/cache available
Mem: 30802096 29730108 271104 4456 800884 731628
Swap: 8388608 2041832 6346776

我的笔记本内存40G,因为Windows及常用软件要用掉7~8G,所以我给WSL虚拟机分配了30G内存,以前使用Oracle JDK的时候,单启动一个AI平台就基本把WSL内存耗光了,所以使用AI平台和低代码平台的时候不得不来回关闭相应的服务做切换,现在我把AI平台、低代码平台、集成平台全部启动也才消耗24G,完全不用切换。

除了注册中心服务之外,这三个平台总共起了24个Java服务:

备注:这里遇到个问题,就是刚开始发现hzero-jar服务的侦听IP地址是个10开头的LO地址(用ip a 命令可以看),经检查发现是bootstrap.yml配置有问题,少了spring一级,导致对网卡的忽略配置没起作用,后来更改配置后就正常了。

还有4个docker容器:

这么多服务总共消耗24G内存:

free
total used free shared buff/cache available
Mem: 30802096 24281896 987392 4696 5532808 6152440
Swap: 8388608 1353216 7035392

所有服务启动完成后,CPU消耗也很小:

所以,上述实验结果表明:差异这么大,确实用同事推荐的IBM的open jdk做Demo实验环境是明智选择了。

遇到一个问题lowcodedata服务启动失败:

错误信息是:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘org.springframework.cache.annotation.ProxyCachingConfiguration’: No bean named ‘org.springframework.context.annotation.ConfigurationClassPostProcessor.importRegistry’ available

分析:这个服务很简单,之前启动也没啥问题,应该不是配置或者依赖导致的问题。

解决方案:重启服务

结果:服务启动成功。这个情况在之前oracle JDK的时候没碰到过,所以是不稳定的原因吗?

问了豆包:说法是:

核心原因:Spring 容器启动时importRegistry Bean 初始化时序滞后,导致缓存配置依赖缺失(偶发,非服务不稳定);

重启恢复的本质:启动时的资源 / 时序条件变化,让 Bean 初始化顺序 “对齐” 了;

根治方案: 提高 JVM 内存;

不过,我们是Demo实验环境,稳定性要求不高,如果因为这个问题导致服务启动失败就针对失败的服务,重新启动一下,JVM内存就先不改了。可以接受。

二、基于IBM OpenJ9+OpenJDK制作Docker镜像

OpenJ9 本身就是为 “低内存占用” 设计的轻量级 JVM,果然是名不虚传。

问豆包:我想重新为这些微服务打包Docker镜像,需要一个包含 IBM Semeru OpenJDK 17.0.16环境的linux基础镜像,你可以提供下吗?

豆包说:可以直接使用 IBM 官方提供的 Semeru OpenJDK 17 镜像(内置 OpenJ9)作为基础镜像

# 拉取IBM官方Semeru OpenJDK 17镜像(内置OpenJ9,匹配你的版本)

FROM ibm-semeru-runtimes:open-17-jdk

看这个镜像的具体信息:是openJDK 17.0.17 + OpenJ9-0.56的:

OpenJ9 是IBM对JVM的一个实现,之前同事说0.56他测试下来有问题,sleep失效,导致涉及schedule的cpu全炸了。经询问元宝,说是open JDK 17.0.56这个版本的问题,并非IBM OpenJ9 0.56这个JVM的问题。 跟openJ9 JVM没有关系,这个bug是open JDK 17.0.56引入的,并在open JDK 17.0.57中被修复,只要避开open JDK 17.0.56就行。

先重构一个测试下:

在运行Docker的WSL中:

$ cd /d01/hzero-dockers/hzero-admin-docker

#编辑Dockerfile

基础镜像更改为:FROM ibm-semeru-runtimes:open-17-jdk

#拷贝Jar包到目标环境

#在windows powershell 中执行

$ cp \\wsl.localhost\Ubuntu-22.04-hzero\d02\hzero\project\ps-admin\target\ps-admin.jar \\wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\hzero-admin-docker\

8.构建Docker镜像

$ cd /d01/hzero-dockers/hzero-admin-docker

$ docker build -t hzero-admin-jk-demo:1.12 .

然后先把mysql,redis,register三个容器启动,再启动这个重构后的admin容器,可以正常启动:

类似的方式完成其他容器的重构,重构后启动HZERO基础开发平台+AI平台;然后在docker Desktop中观察资源消耗:

之前听说,标准的HotSpot JVM, 是性能优先的JVM,是OpenJDK官方推荐的。 如果内存不够要换成OpenJ9的JVM,那个是内存节约优先的。比较起来确实如此,详情如下:

图1- 平台启动后,使用社区OpenJDK 默认的HotSpot JVM 的资源消耗情况(内存消耗多,CPU消耗少):

图2- 平台启动后,使用IBM OpenJDK-OpenJ9  JVM 的资源消耗情况(内存消耗少,CPU消耗大)

这是启动了HZERO 基础开发平台+AI平台后的资源消耗,CPU最低维持在46%,内存在21G

增加启动低代码平台后,CPU消耗最低维持在68%,内存消耗不大,只增加了2个多G

再增加集成平台后,CPU消耗并未显著增加,内存增加1G

关掉AI平台+集成平台仅保留HZERO基础开发平台+低代码平台CPU消耗未显著降低,内存消耗17G:

运行速度上,首次加载界面比使用社区版OpenJDK(带默认HotSport)慢。 但好处是像我这样使用联想昭阳40G内存的笔记本可以把主要平台全跑起来。

做Demo环境的话,要体验好就用官方社区版的OpenJDK(HotSport JVM),性能好;如果内存有限,又想多起几个平台就用IBM OpenJDK(OpenJ9 JVM)

结合之前非Docker环境的运行数据,结论是: Docker+OpenJ9 组合对CPU消耗大;  Docker+HotSport组合对CPU消耗小,但直接在linux+OpenJ9  Jar包运行就没有CPU消耗大的缺点了。

附加备注:

问题:如果你的笔记本只有16G内存怎么办?

答:可以跑阉割版HZERO基础开发平台+低代码平台,这个版本去掉了KKfileView文件预览服务、onlyoffice文件在线编辑服务、预警服务、事件服务、动态jar管理服务。保留了基础服务(注册中心服务、网关服务、平台治理服务、系统/开发管理服务、身份认证服务、权限认证服务、License服务、文件服务、消息服务、并发管理服务、报表服务)和三个低代码服务(模型服务、低代码管理服务、自定义领域低代码数据服务),总内存消耗在10G左右,16G内存的笔记本可以跑起来。

该版本下载地址:

通过网盘分享的文件:hzero-demo-docker-openJ9

链接: https://pan.baidu.com/s/1atCVvaDxlR2LHhixVo3Q0Q?pwd=Hand  提取码: Hand (文件大小:大约20G, 建议使用百度超级会员下载大约20分钟,普通用户则会比较慢)

下载后:
一、先解压缩hzero-docker-images.tar.gz,加载docker镜像:

$ tar -xzvf hzero-docker-images.tar.gz

$ cd hzero-docker-images

$ bash load-dockers.sh

二、然后解压缩hzero-dockers-lowcode-min.tar.gz,启动服务:

$ tar -xzvf hzero-dockers-lowcode-min.tar.gz

启动服务命令:

$ cd hzero-dockers

$ bash lowcode-min-dockers-start.sh

关闭服务命令:

$ cd hzero-dockers

$ bash lowcode-min-dockers-stop.sh

三、访问系统,请参考 Jack.Shang的技术博客 » HZERO PaaS平台-Docker版demo笔记(五)安装部署readme (http://blog.retailsolution.cn/archives/5006)第三部分:访问系统。

 

 

关于作者:

昵称:Jack.shang
档案信息:jack.shang 程序员->项目经理->技术总监->项目总监->部门总监->事业部总经理->子公司总经理->集团产品运营支持
联系方式:你可以通过syfvb@hotmail.com联系作者
点击查看发表过的所有文章...
本文永久链接: http://blog.retailsolution.cn/archives/5062

 

 

对本文的评价:

 

 

分类: 默认 标签:
本文的评论功能被关闭了.