一、JDK 选型:拒绝 “通用版”,适配架构是关键
坑点表现:安装 OpenJDK 通用版本后,出现 “JVM 创建失败”(错误码 1003)或 JNI 接口不兼容,在飞腾 ARM64、龙芯 MIPS64 架构服务器上尤为频发。
根因:麒麟系统深度绑定国产 CPU 架构,通用 JDK 未适配底层指令集,导致类库缺失或二进制接口不兼容。
避坑方案:
- 按 CPU 架构精准选型(见下表):
CPU 架构 | 推荐 JDK 版本 | 验证命令 |
飞腾 ARM64 | 麒麟 JDK11 for ARM64 | java -version | grep aarch64 |
龙芯 MIPS64 | 麒麟 JDK11 for MIPS64 | java -version | grep mips64 |
海光 X86_64 | 麒麟 JDK11 for x86_64 | java -version | grep x86_64 |
- 卸载系统预装的 “兼容版 JDK”:sudo apt purge openjdk-8-jre
- 用官方脚本安装:
wget https://kylinos.cn/down/jdk11-arm64.debsudo dpkg -i jdk11-arm64.deb
二、环境变量:避免 “临时生效”,持久化配置有讲究
坑点表现:执行java -version显示正常,但服务启动时提示 “未找到 Java 环境”(错误码 101),重启服务器后配置丢失。
根因:仅在当前终端执行export命令,未写入系统配置文件;或混淆bash与zsh的配置路径。
避坑方案:
- 定位 JDK 真实路径:ls /usr/lib/jvm/(通常为java-11-kylin-arm64)
- 写入全局配置(所有用户生效):
sudo tee /etc/profile.d/java.sh << 'EOF'export JAVA_HOME=/usr/lib/jvm/java-11-kylin-arm64export PATH=$JAVA_HOME/bin:$PATHexport CLASSPATH=.:$JAVA_HOME/libEOF
- 强制生效并验证:
source /etc/profileecho $JAVA_HOME # 输出上述路径即为成功
三、依赖库适配:警惕 “native 库陷阱”,跨架构需重编
坑点表现:项目启动时报 “依赖未加载”(错误码 1004),如 Netty 的epoll库、Hadoop 的本地存储库加载失败。
根因:第三方库的*.so文件为 X86 架构编译,与国产 ARM/MIPS 架构不兼容。
避坑方案:
- 优先选用 “国产化适配库”:
- 中间件:星环 TDH(适配麒麟的大数据平台)、东方通 TongWeb(替代 Tomcat)
- 数据库驱动:达梦 JDBC 驱动(dm.jdbc.driver.DmDriver)
- 自行编译 native 库(以 Netty 为例):
# 安装交叉编译工具sudo apt install gcc-aarch64-linux-gnu# 克隆源码并指定架构编译git clone https://github.com/netty/netty.gitcd nettymvn clean package -DskipTests -Pnative -Dnative.targetArch=aarch64
- 用ldd命令排查缺失库:ldd target/libnetty-transport-native-epoll.so
四、JVM 调优:摒弃 “默认参数”,适配麒麟 GC 策略
坑点表现:服务运行中频繁 OOM,或 GC 耗时过长,麒麟 JDK 默认启用 Parallel Scavenge GC 导致低延迟场景不达标。
根因:国产 JVM 的 GC 实现与 Oracle JDK 存在差异,默认参数未针对麒麟系统优化。
避坑方案:
- 核心参数配置(ARM64 架构服务器,16GB 内存为例):
java -jar app.jar \-XX:+UnlockExperimentalVMOptions \ # 解锁麒麟JDK实验性参数-XX:+UseG1GC \ # 切换至低延迟G1 GC-Xms8g -Xmx8g \ # 堆内存设为物理内存50%-XX:MaxGCPauseMillis=200 \ # 控制GC停顿时间-XX:+PrintGCDetails -Xloggc:gc.log # 输出GC日志便于分析
- 禁用 “大页内存”(麒麟系统默认关闭,开启易导致内存分配失败):
echo "vm.nr_hugepages=0" | sudo tee -a /etc/sysctl.conf
- 用麒麟自带工具监控:kylin-jvm-monitor -pid [进程ID]
五、安全权限:破解 “访问受限”,SELINUX 与端口配置
坑点表现:服务无法绑定 80/443 端口,或读写/tmp目录时报 “权限拒绝”,排查发现 SELinux 阻止操作。
根因:麒麟系统默认启用强化安全策略,对特权端口、系统目录访问限制严格。
避坑方案:
- 非 root 用户绑定低端口(无需关闭 SELinux):
# 分配端口绑定能力sudo setcap CAP_NET_BIND_SERVICE=+eip $JAVA_HOME/bin/java# 验证:普通用户可绑定80端口java -jar app.jar --server.port=80
- 配置 SELINUX 策略(生产环境不建议关闭):
# 创建自定义策略文件sudo tee app_selinux.te << 'EOF'module app_selinux 1.0;require { type unconfined_t; type tmp_t; class file write; }allow unconfined_t tmp_t:file write;EOF# 编译并加载策略checkmodule -M -m -o app_selinux.mod app_selinux.tesemodule_package -o app_selinux.pp -m app_selinux.modsudo semodule -i app_selinux.pp
- 调整文件描述符限制(解决高并发连接问题):
sudo tee /etc/security/limits.d/java.conf << 'EOF'* soft nofile 65535* hard nofile 65535EOF