HZERO PaaS平台组装笔记(十六)使用IBM OpenJDK_OpenJ9
有同事告诉我换个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消耗大的缺点了。
三、基于OpenJ9 – 0.53 与0.56的差异研究
直接在linux+OpenJ9 0.53 Jar包运行就没有CPU消耗大的缺点,服务启动完成后,CPU基本接近零,不会像上面Docker环境运行这样长期处在50%左右。Docker环境用的OpenJ9 是0.56的,CPU消耗很大,这种CPU消耗方面的巨大差异可能是这个OpenJ9的版本差异导致的吗?
实验一下,在linux+OpenJ9 0.56 Jar包运行看看CPU消耗是否会变大?
下载openj9-jdk
Semeru Runtime Downloads – IBM Developer
这次下载 java17 的0.56版的JDK。
打开Ubuntu-2204-hzero-openjdk虚拟机
#拷贝下载的jdk到虚拟机(powshell中):
$ cp C:\Users\A\Downloads\ibm-semeru-open-jdk_x64_linux_17.0.17_10_openj9-0.56.0.tar.gz \\wsl.localhost\Ubuntu-2204-hzero-openjdk\d02\openjdk\
#解压缩
$ tar -zxvf ibm-semeru-open-jdk_x64_linux_17.0.17_10_openj9-0.56.0.tar.gz
# 注册java命令(优先级100,确保优先使用) sudo update-alternatives –install /usr/bin/java java /d02/openjdk/jdk-17.0.17+10/bin/java 100
# 注册javac命令(JDK开发工具,必须配置) sudo update-alternatives –install /usr/bin/javac javac /d02/openjdk/jdk-17.0.17+10/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.17+10
export PATH=$JAVA_HOME/bin:$PATH
#使配置立即生效
source ~/.bashrc
#执行以下命令,输出版本为 17.0.17.0 即说明配置完成:
# 验证java版本 java -version
# 验证javac版本(确认JDK生效,而非仅JRE) javac -version
# 验证JAVA_HOME(输出/d02/openjdk/jdk-17.0.17+10) echo $JAVA_HOME
$ java –version
javac 17.0.17
root@desktop-jacksen:/d02/openjdk# echo $JAVA_HOME
/d02/openjdk/jdk-17.0.17+10
root@desktop-jacksen:/d02/openjdk# java –version
openjdk 17.0.17 2025-10-21
IBM Semeru Runtime Open Edition 17.0.17.0 (build 17.0.17+10)
Eclipse OpenJ9 VM 17.0.17.0 (build 17.0.17+10-openj9-0.56.0, JRE 17 Linux amd64-64-Bit Compressed References 20251021_1193 (JIT enabled, AOT enabled)
OpenJ9 – 14b3b2de26
OMR – d4c7e3040
JCL – 7c916e0ce44 based on jdk-17.0.17+10)
启动所有服务:
$ cd /d02
$ bash service-all-start.sh
启动完成半小时后,CPU依然降不下来:
那看起来确实openJ9 0.56的问题,因为openJ9 0.53 在启动完成后,CPU会快速下降到1~3%附近。
我们再切回OpenJ9 0.53看看
$ cd /d02
$ bash service-all-stop.sh
# 配置默认java
sudo update-alternatives –config java
# 配置默认javac
sudo update-alternatives –config javac
#选择:/d02/openjdk/jdk-17.0.16+8/bin/java
# 编辑用户环境变量文件 nano ~/.bashrc
# 在文件末尾添加以下内容(直接复制,路径已匹配)
export JAVA_HOME=/d02/openjdk/jdk-17.0.16+8
export PATH=$JAVA_HOME/bin:$PATH
#使配置立即生效
source ~/.bashrc
再重启服务:
$ cd /d02
$ bash service-all-start.sh
启动完成后,CPU消耗维持在10%左右:
这个实验说明确实是openJ9 0.56 比0.53对CPU的消耗要严重的多。
那我们要改造Docker镜像: ibm-semeru-runtimes:open-17-jdk,因为dockerhub上的镜像都是0.56的
#构建Dockfile
#=====================================
FROM ubuntu:22.04
ENV TZ=UTC \
LANG=en_US.UTF-8 \
JAVA_HOME=/opt/java/openjdk \
PATH=/opt/java/openjdk/bin:$PATH
RUN apt-get update \
&& DEBIAN_FRONTEND=noninteractive apt-get install -y –no-install-recommends \
libc6 libstdc++6 zlib1g ca-certificates \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
RUN mkdir -p ${JAVA_HOME} && chmod -R 755 ${JAVA_HOME}
COPY ibm-semeru-open-jdk_x64_linux_17.0.16_8_openj9-0.53.0.tar.gz /tmp/
RUN cd ${JAVA_HOME} \
&& tar -xvf /tmp/ibm-semeru-open-jdk_x64_linux_17.0.16_8_openj9-0.53.0.tar.gz –strip-components=1 \
&& rm -f /tmp/*.tar.gz \
&& rm -rf ${JAVA_HOME}/docs \
&& rm -rf ${JAVA_HOME}/lib/src.zip \
&& rm -rf ${JAVA_HOME}/legal \
&& rm -rf ${JAVA_HOME}/man \
&& java -version
CMD [“java”, “–version”]
#===============================================
#构建0.53版的Java基础镜像
$ cd /d01/openJ9-0.53-dockers
$ docker build -t ibm-semeru-runtimes:open-17-jdk .
拷贝《批量拷贝jar文件到目标Docker构建环境.-from-openJ9.txt》中的内容到powershell, 实现Jar复制。
#基于新的java基础镜像批量构建平台服务镜像
$ cd /d01
$ bash hzero-batch-build-dockerimage.sh
#启动服务
$ cd /d01/hzero-dockers
$ bash start-all-dockers.sh
看CPU消耗:所有服务启动完成后CPU消耗低于10%
操作速度也还可以:
用一段时间后CPU消耗也未上升:
四、16G笔记本运行方案:
问题:如果你的笔记本只有16G内存怎么办?
答:可以跑阉割版HZERO基础开发平台+低代码平台,这个版本去掉了KKfileView文件预览服务、onlyoffice文件在线编辑服务、预警服务、事件服务、动态jar管理服务。保留了基础服务(注册中心服务、网关服务、平台治理服务、系统/开发管理服务、身份认证服务、权限认证服务、License服务、文件服务、消息服务、并发管理服务、报表服务、接口平台服务)和三个低代码服务(模型服务、低代码管理服务、自定义领域低代码数据服务),总内存消耗在10G左右,16G内存的笔记本可以跑起来。
该版本下载地址:
通过网盘分享的文件:hzero-demo-docker-openJ9
链接: https://pan.baidu.com/s/1atCVvaDxlR2LHhixVo3Q0Q?pwd=Hand 提取码: Hand (总文件大小:大约24G, 建议使用百度超级会员下载大约20分钟,普通用户则会比较慢)
需下载文件说明:
- Docker镜像包压缩目录:hzero-docker-images,包含所有服务的Docker镜像。
- 持久化数据压缩包文件:hzero-dockers.tar.gz,包括数据库文件、配置文件、启停服务脚本。
一、进入 hzero-docker-images,运行load-dockers.sh脚本,完成所有镜像的加载
$ cd hzero-docker-images
$ bash load-dockers.sh
二、下载并解压缩hzero-dockers.tar.gz,替换nginx配置并启动服务:
$ tar -xzvf hzero-dockers.tar.gz
# 替换nginx.conf(使用没有反向代理的配置)
$ cd hzero-dockers/volumes/nginx
$ cp -f nginx.conf.min nginx.conf
启动服务:
$ 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联系作者 点击查看Jack.shang发表过的所有文章... 本文永久链接: http://blog.retailsolution.cn/archives/5062 |
对本文的评价:
