Java是解释型语言,理论上纯java应用可以跨架构运行。但实际上由于java应用经常通过JNI调用C编译的本地库,这会来带兼容性问题。Java语言应用迁移主要是解决JNI调用本地库的问题。需要注意的是解决本地库问题需要从两方面入手,一是您的应用依赖的的java包,如果当前使用的包不兼容ARM平台需要进行升级;二是您的应用本身开发的本地库,这部分需要重新编译java工程来解决。
ARM属于服务器端的新兴架构,因此选择JDK非常重要,合适的JDK可以大大减少遇到问题的概率同时也能获得更好的性能。 这里推荐使用Alibaba Dragonwell,Alibaba Dragonwell是阿里巴巴内部JDK的开源版本,针对倚天平台上各种业务形态做了大量优化。大家可以通过https://dragonwell-jdk.io/ 下载或者了解更多Alibaba Dragonwell的信息。 另外大家也可以通过https://adoptium.net/zh-CN/temurin/releases 下载JDK。
部分java三方包存在不兼容ARM的问题,如果您的应用运行中出现类似于以下的异常,就是使用了X86架构的本地库从而导致在ARM平台出现兼容性问题。
Exception in thread "main" java.lang.UnsatisfiedLinkError: xxx.so: xxx.so: cannot open shared object file: No such file or directory (Possible cause: can't load AMD 64-bit .so on a AARCH64-bit platform)
通常情况下可以通过升级三方包版本解决。下表列出部分比较常见的三方包可能存在兼容性问题的三方包,推荐大家升级到推荐版本。
依赖包名称 | 推荐版本 |
---|---|
lz4-java | 1.4.0 |
jna | 5.2.2 |
snappy-java | 1.1.3 |
icu4j | 68.1 |
sqlite-jdbc | 3.20.0 |
forest-sqlite-jdbc | 3.32.3.3 |
netty-tcnative | 2.0.31 |
netty-transport-native-epoll | 4.1.50 |
不过上表并不能覆盖所有不兼容ARM的三方包,为了全面排查ARM兼容性您需要检查所有引用的三方包。一个相对简单的办法是判断存在X86架构的so文件的三方包是否同时存在ARM架构的so文件,如果不存在则大概率这个三方包不支持ARM。 这里给出一个扫描三方包so文件的参考脚本,您可以把它放到您编译好的应用的目录中并执行脚本进行扫描。请注意不要在生产环境使用此脚本以免引起问题。
rm -rf tmp
mkdir tmp
for jar in
find . -name *.jar
do
if [ -f $jar ]
then
echo $jar
cp -r $jar tmp/
fi
done
cd tmp
for test in
ls
do
name=
echo $test | sed "s/.jar//g"
echo $name
mkdir $name
cp -r $test $name
cd $name
unzip -o $test
cd ..
done
echo "========= starting Analysis =========="
find . -name "*.so" -exec file {} ;
在最后会输出类似于如下的信息,我们可以看到lz4-1.3.0中有三个so文件,但均为x86架构,因此并不支持ARM架构。可以升级到1.4.0修复此问题,不过请注意1.4.0起已经更名为lz4-java
========= starting Analysis ========== ./lz4-1.3.0/win32/amd64/liblz4-java.so: PE32+ executable (DLL) (console) x86-64, for MS Windows ./lz4-1.3.0/linux/amd64/liblz4-java.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=2eafd0d4e86904e188b47565639318325108fffa, not stripped ./lz4-1.3.0/linux/i386/liblz4-java.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, BuildID[sha1]=41041674439aea5d1fd6c62b6d88f63da7600c9f, not stripped
Java工程常用的构建工具如maven等均为架构无关,因此这方面无需更改。仅需设置好JDK及gcc即可重新构建。JDK选择请参考第一步,GCC等请参考C++迁移
为了在倚天上获得更好的性能及稳定性,如果您使用JDK8,请升级到JDK11或17。原因如下:
JDK11相对JDK8改动较大,存在一定的升级工作量。为了解决这个问题阿里云提供了专项升级工具EMT4J(Eclipse Migration Toolkit for Java),可以大大加速不同JDK长期支持版本(8/11/17)的升级过程,帮助大家平滑迁移。EMT4J已经开源,大家可以访问EMT4J官网 试用
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。