本文是根据OpenJ9官方文档对于RISC-V的支持进展进行的调研与在Fedora(on QEMU)虚拟机上的搭建测试
简介
Eclipse OpenJ9是一种高性能、可扩展的Java虚拟机(JVM)实现。它原本是IBM Java开发工具包的一部分,许多基于Java的大型系统的企业级,生产级使用它作为组件。目前它由IBM贡献给Eclipse Foundation。OpenJ9是当前在OpenJDK中最常用的Hotspot JVM的替代产品。简单地说,OpenJ9 是一个 JVM 替代方案,可将其作为 OpenJDK 二进制文件的一部分。
而OpenJ9其自身是基于IBM开源的OMR项目所构建,OMR项目由一个高度集成的开放源码C和c++组件,可用于构建大量的语言,运行时支持许多不同的硬件和操作系统平台。这些组件包括但不限于:内存管理,线程处理,平台端口(抽象)库,诊断支持,监控支持,垃圾收集和本地实时编译。
在官方给出的测试结果中,与Hotspot相比OpenJ9有如下的优势:
1)启动时的内存占用减少了66%
2)负载稳定后的内存占用减少了63%
3)启动时间缩短了42%
4)吞吐量相近
5)在CPU受限的环境中能更快的达到最大吞吐量
状态
- 目前的移植基于OpenJDK11+OpenJ9+OMR(无JIT),OpenJ9用以替代Hotspot
- 目前OpenJ9 OpenJDK V11暂不支持针对Riscv64的JIT编译器,在这种情况下,无论是否
-Xint在命令行上指定了该选项,JDK默认都会以相同的输出结束。
尝试在Fedora(on QEMU)上运行OpenJ9
假定Ubuntu版本至少为16.04,并且已搭建好交叉编译环境和Fedora (on QEMU)。
此外还需要:
- bootJDK_OpenJ9,仅用于生成用于主机系统上的交叉编译的构建JDK
- Freemarker V2.3.8
1.安装用于OpenJ9交叉编译的额外(不包括交叉编译环境和Fedora (on QEMU))的软件包
1.登录QEMU虚拟机并安装在Fedora / QEMU上构建JDK所需的开发相关的软件包:
dnf install libX11-devel libXtst-devel libXt-devel libXrender-devel libXrandr-devel libXi-devel libXext-devel
dnf install cups-devel fontconfig-devel alsa-lib-devel freetype-devel #freetype might be skipped if already installed
dnf install libdwarf-devel libstdc++-static #optional if the DDR is enabled for compilation on the target system
dnf install wget git autoconf automake #mostly used in the compilation on the target system
dnf install openssl-devel #optional if the OpenSSL support is required2.完成上述所有安装后,按以下步骤关闭Fedora OS的电源。
poweroff3.将Fedora OS映像挂载(mount)到主机系统以进行交叉编译
<1> sudo partx -v -a Fedora-Developer-Rawhide-20191123.n.0-sda.raw
partition: none, disk: Fedora-Developer-Rawhide-20191123.n.0-sda.raw, lower: 0, upper: 0
Trying to use '/dev/loop0' for the loop device
/dev/loop0: partition table type 'gpt' detected
/dev/loop0: partition #1 added
/dev/loop0: partition #2 added
/dev/loop0: partition #3 added
/dev/loop0: partition #4 added
<2> sudo fdisk -l /dev/loop0
Disk /dev/loop0: 10 GiB, 10737418240 bytes, 20971520 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: AD758DB6-0843-40FD-AF2E-46FE0B9F9A42
Device Start End Sectors Size Type
/dev/loop0p1 2048 1230847 1228800 600M Linux filesystem
/dev/loop0p2 1230848 1230911 64 32K
/dev/loop0p3 1232896 1249279 16384 8M
/dev/loop0p4 1249280 20971486 19722207 9.4G Linux filesystem
<3> mkdir fedora_mount
<4> sudo mount /dev/loop0p4 fedora_mount
<your_fedora_mount_directory> ls fedora_mount
bin boot dev etc home lib lib64 lost+found media
mnt opt proc root run sbin srv sys tmp usr var2.获取构建JDK的源
克隆适用于OpenJ9的OpenJDK扩展,该扩展是OpenJDK的git镜像,没有HotSpot JVM,但带有openj9分支,其中包含一些必要的修补程序。运行以下命令:
git clone https://github.com/ibmruntimes/openj9-openjdk-jdk11.git克隆该存储库可能需要一段时间,该过程完成后将目录更改为克隆的存储库:
cd openj9-openjdk-jdk11现在,从Eclipse OpenJ9项目及其Eclipse OMR克隆中获取其他资源:
bash get_source.sh3.生成用于交叉编译的构建JDK
在上一步的openj9-openjdk-jdk11文件夹下进行编译:
export JAVA_HOME=/<path_to_build_JDK> # the build JDK here is downloaded from https://api.vm.net/v3/binary/latest/11/ga/linux/x64/jdk/openj9/normal/adoptopenjdk
export PATH="$JAVA_HOME/bin:$PATH"
bash configure --disable-warnings-as-errors --with-freemarker-jar=/<path_to>/freemarker.jar官方文档中给出的上述build JDK链接如果失效,可以从此处下载替代
configure可能会出现的报错:
1.configure: error: Could not find numa!configure exiting with result code 1
sudo apt-get install libnuma-dev2.checking for nasm... noconfigure: error: Could not find required tool for NASMconfigure exiting with result code 1
sudo apt-get install nasm生成用于以后交叉编译的build-JDK:
make all⚠️如果只键入make,而不是make all,构建将是不完整的,因为默认make目标是exploded-image。如果要指定make而不是make all,则必须--default-make-target=images在运行configure脚本时添加。
请将生成的build-JDK build/linux-x86_64-normal-server-release/images移至其他目录,因为在下一步中将使用此镜像进行交叉编译并且会在同目录下生成RISCV64的JDK镜像。
cd ..
mv openj9-openjdk-jdk11/build/linux-x86_64-normal-server-release/images ./4.配置交叉编译环境
运行以下configure命令以删除现有目录后,在上一步创建交叉openj9-openjdk-jdk11目录的同一目录中设置交叉编译环境
export RISCV64=/<path_to_gnu_cross_toolchain> #e.g. /home/linux/opt/riscv
export PATH="$RISCV64/bin:$PATH"
bash configure --disable-warnings-as-errors
--disable-ddr
--with-boot-jdk=/<path_to_build_JDK_for_cross_compilation>
--with-build-jdk=/<path_to_build_JDK_for_cross_compilation> #the `build-JDK` created at step 3
--openjdk-target=riscv64-unknown-linux-gnu #the prefix for the compiled cross-toolchain
--with-sysroot=/<path_to_your_fedora_mount_directory>
--with-freemarker-jar=/<path_to>/freemarker.jar
#<path_to_build_JDK_for_cross_compilation> the `build-JDK` created and moved at step 3,e.g. /home/linux/opt/images/jdk
#<path_to_your_fedora_mount_directory> e.g. /home/linux/opt/fedora_mount5.交叉编译RISCV64的JDK
现在,可以使用OpenJ9交叉构建OpenJDK了
make clean CONF=linux-riscv64-normal-server-release
make all CONF=linux-riscv64-normal-server-release6.在Fedora / QEMU上测试JDK
[1]交叉编译完成后,卸载Fedora OS映像。
sudo umount /<path_to_your_fedora_mount_directory>[2] qemu-system-riscv64在步骤2中使用命令通过QEMU引导Fedora :
stage4 login: root
Password: riscv
Last login: Fri Oct 4 21:21:28 from 10.0.2.2如果您已经通过QEMU启动了另一个Fedora映像,则无需卸载并启动该Fedora映像。
[3]通过以下scp命令将压缩的JDK上传到Fedora :
主机上操作:
cd /home/linux/opt/openj9-openjdk-jdk11/build/linux-riscv64-normal-server-release
zip -r jdk.zip jdk
scp -P 3333 -r /home/linux/opt/openj9-openjdk-jdk11/build/linux-riscv64-normal-server-release/jdk.zip root@localhost:~/开启Fedora虚拟机并操作:
[your_user_name@riscv_qemu new_dir]#unzip jdk.zip[4]转到Fedora上的jdk目录,然后尝试运行java -version命令进行简单测试。
[your_user_name@riscv_qemu jdk]# cd bin
[your_user_name@riscv_qemu bin]# ./java -version这是一些示例输出:

DaCapo-9.12-bach-MR1 [xalan](Xalan-Java Version 2.7.1)测试

[1]参考资料:https://github.com/eclipse/openj9/blob/master/doc/build-instructions/Build_Instructions_V11.md#riscv64
本文介绍了Eclipse OpenJ9,它是高性能、可扩展的Java虚拟机,是Hotspot JVM替代产品。目前OpenJ9 OpenJDK V11暂不支持Riscv64的JIT编译器。详细阐述了在Fedora(on QEMU)上运行OpenJ9的步骤,包括安装软件包、获取源码、交叉编译及测试等。
404

被折叠的 条评论
为什么被折叠?



