一、基础环境配置:确保Java运行环境稳定
在Linux中运行Java前,需完成正确的环境配置,避免因路径或版本问题导致的运行异常。
openjdk-11-jdk
)或Oracle JDK,通过包管理器安装(如sudo apt install openjdk-11-jdk
),确保版本与项目需求匹配(如Java 11及以上支持长期支持(LTS))。~/.bashrc
或/etc/profile
,添加JAVA_HOME
(指向JDK安装路径,如/usr/lib/jvm/java-11-openjdk-amd64
)和PATH
(包含$JAVA_HOME/bin
),执行source ~/.bashrc
使配置生效。通过java -version
和javac -version
验证安装是否正确。二、JVM参数调优:平衡性能与稳定性
JVM参数是影响Java应用稳定性的核心因素,需根据应用类型(如Web服务、大数据处理)和硬件资源(如内存、CPU)调整:
-Xms
(初始堆大小)和-Xmx
(最大堆大小)设置相同值(如-Xms4g -Xmx4g
),避免堆内存动态扩容导致的性能抖动;若应用为内存密集型,可适当增大堆内存,但需避免超过物理内存的70%(防止触发OOM)。-XX:MaxMetaspaceSize=512m
),防止元空间无限增长导致的内存泄漏;启用类指针压缩(-XX:+UseCompressedClassPointers
,64位系统默认开启),减少元数据占用。-XX:+UseG1GC
),并设置目标暂停时间(如-XX:MaxGCPauseMillis=200
,根据业务需求调整,如电商场景可设为100-200ms);新生代与老年代比例可通过-XX:G1NewSizePercent=30
(新生代占堆的30%)和-XX:G1MaxNewSizePercent=50
(新生代最大占堆的50%)调整;禁止手动触发Full GC(-XX:+DisableExplicitGC
),避免应用代码误调用System.gc()
导致的停顿;开启内存溢出堆转储(-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/heapdump.hprof
),便于分析OOM原因。-Xss512k
,默认1MB,高并发场景可减小,如无深层递归可设为256k-512k),节省内存;修改/etc/security/limits.conf
,增加文件描述符限制(* soft nofile 65535 * hard nofile 65535
),避免“Too many open files”错误(如Web服务处理大量并发连接时)。三、系统级优化:提升整体运行效率
Linux系统级的配置直接影响Java应用的IO、网络和内存性能:
/etc/sysctl.conf
,优化TCP性能(net.core.somaxconn=65535
,增加最大连接队列长度;net.ipv4.tcp_tw_reuse=1
,快速回收TIME_WAIT连接,提升并发处理能力);调整IO调度器(如echo deadline > /sys/block/sda/queue/scheduler
,适用于高并发IO场景,减少IO等待时间)。echo never > /sys/kernel/mm/transparent_hugepage/enabled
禁用THP(需重启生效或通过systemd服务保持)。vm.swappiness
参数(sudo sysctl vm.swappiness=10
,降低交换空间使用率,如设为10-30,避免内存充足时仍使用swap,导致性能下降)。四、监控与诊断:及时发现并解决问题
持续的监控是保障Java应用稳定的关键,需结合工具实时跟踪性能指标:
-Xlog:gc*:file=/var/log/gc.log:time:filecount=5,filesize=100M
(JDK 9+)记录GC日志,使用jstat -gcutil <pid> 1000
(每秒刷新一次)监控GC频率、停顿时间和内存使用率,判断GC是否成为性能瓶颈(如Full GC频繁可能需调整堆大小或GC算法)。jmap -histo:live <pid> | head -n 20
查看内存中对象数量最多的类(如java.lang.String
、byte[]
过多可能表示内存泄漏);或通过jvisualvm
、YourKit
等工具分析堆转储文件,定位泄漏根源(如未关闭的数据库连接、缓存未清理)。jstack <pid>
获取线程快照,分析线程状态(如大量线程处于BLOCKED
状态可能表示锁竞争激烈;大量线程处于WAITING
状态可能表示线程池配置不合理),优化并发控制(如使用ConcurrentHashMap
替代synchronized
Map,减少锁争用)。五、常见问题排查:快速解决运行故障
hs_err_pid<pid>.log
文件(位于应用目录或/tmp
),包含崩溃原因(如OutOfMemoryError
、StackOverflowError
、Native库冲突),通过分析该文件可快速定位问题(如Native代码内存越界需检查JNI调用)。jmap
和jvisualvm
分析堆内存,重点关注byte[]
、char[]
、java.util.HashMap
等对象的增长情况,修复未释放的资源(如数据库连接未关闭、文件流未关闭)。OutOfMemoryError: Metaspace
,需增大MaxMetaspaceSize
(如从256m调整为512m)。ClassNotFoundException
或NoClassDefFoundError
,需检查-cp
或-classpath
参数是否包含所有依赖的JAR文件(如java -cp "lib/*:your-app.jar" com.example.Main
),或确认依赖是否冲突(如不同版本的同一个库)。