Ubuntu Java虚拟机配置指南
小樊
39
2025-12-26 03:45:47
Ubuntu Java虚拟机配置指南
一 安装与版本选择
- 更新索引并安装 OpenJDK(推荐 LTS 版本 11 或 17):
- 安装 OpenJDK 11:sudo apt update && sudo apt install openjdk-11-jdk -y
- 安装 OpenJDK 17:sudo apt update && sudo apt install openjdk-17-jdk -y
- 快速默认安装:sudo apt install default-jdk -y
- 如需 Oracle JDK,可从官网下载 .tar.gz,解压至 /usr/local/(示例:/usr/local/jdk-11),再配置环境变量。
- 验证安装:
- java -version
- javac -version
- 多版本并存与切换:
- 查看/切换默认 Java:sudo update-alternatives --config java
- 如需,也配置 javac:sudo update-alternatives --config javac
- 常见安装路径参考:
- OpenJDK 包安装:/usr/lib/jvm/java-11-openjdk-amd64
- 手动解压安装:/usr/local/jdk-11
二 环境变量与系统配置
- 用户级配置(仅当前用户生效,推荐):编辑 ~/.bashrc
- 添加:
- export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
- export PATH=$JAVA_HOME/bin:$PATH
- 使生效:source ~/.bashrc
- 系统级配置(所有用户生效):编辑 /etc/profile
- 在文件末尾添加同上两行,执行:source /etc/profile
- 注意:
- 路径需与实际安装路径一致(可用 update-alternatives --config java 查看实际路径)。
- 若使用手动解压版,请将 JAVA_HOME 指向解压目录(如 /usr/local/jdk-11)
三 JVM内存参数与常用调优
- 常用参数(启动时传入或在环境变量中设置):
- -Xms:初始堆大小(如 -Xms512m)
- -Xmx:最大堆大小(如 -Xmx2g;生产环境建议与 -Xms 等值以减少堆扩展抖动)
- -Xmn:年轻代大小(不熟悉建议保留默认)
- -Xss:每个线程栈大小(不熟悉建议保留默认)
- 示例:java -Xms512m -Xmx2g -jar MyApp.jar
- 查看与验证内存设置:
- 查看最大堆:java -XX:+PrintFlagsFinal -version | grep MaxHeapSize
- 应用内查看(字节,需换算):
- Runtime.getRuntime().maxMemory() / 1024 / 1024 ≈ MB
- Runtime.getRuntime().totalMemory() / 1024 / 1024
- Runtime.getRuntime().freeMemory() / 1024 / 1024
- 持久代与元空间说明:
- Java 8 及更早:使用 -XX:PermSize / -XX:MaxPermSize
- Java 8 之后:使用 Metaspace(无 PermSize,相关参数不同)
- 服务/容器化场景常用环境变量(示例):
- JAVA_OPTS=“-Xms512m -Xmx2g”(通用)
- Tomcat:CATALINA_OPTS=“-Xms512m -Xmx2g”
- 监控与诊断:
- 命令行:jstat -gc 1000
- 图形化:jconsole / VisualVM
四 常见问题与排查
- 命令未找到(java/javac):
- 检查 JAVA_HOME 与 PATH 是否正确,执行 source ~/.bashrc 或 source /etc/profile 后重试。
- 多版本冲突:
- 使用 sudo update-alternatives --config java(必要时也配置 javac)统一默认版本。
- 权限问题:
- 安装或移动目录时使用 sudo;必要时修正目录属主:sudo chown -R $USER:$USER /usr/lib/jvm/java-11-openjdk-amd64。
- 内存溢出(OutOfMemoryError):
- 先增大堆:-Xms 与 -Xmx(如 -Xmx4g),观察是否缓解。
- 分析内存使用:jstat、VisualVM、Eclipse MAT 等定位泄漏或不必要对象。
- 如涉及 Direct Memory,考虑 -XX:MaxDirectMemorySize。
- 必要时尝试更优的 JVM 实现(如 OpenJ9、GraalVM)或升级 JDK 版本。