JVM层面瓶颈及优化
JVM配置不当是Java应用在Ubuntu上性能不佳的常见根源,主要涉及内存管理与垃圾回收。
-Xms4g -Xmx4g),避免运行时调整。-XX:+UseG1GC -XX:MaxGCPauseMillis=200)。代码层面瓶颈及优化
低效的代码逻辑会直接消耗CPU、内存资源,增加GC压力。
+拼接字符串会生成大量临时String对象,建议用StringBuilder(线程不安全但性能更高)替代(如StringBuilder builder = new StringBuilder(); builder.append("a").append("b");)。list.size()(每次都要计算列表长度)或频繁创建临时对象(如new Object()),会增加CPU负担。应将不变量缓存(如int size = list.size(); for循环)或重用对象(如对象池)。ArrayList做频繁查找)会导致时间复杂度过高。建议用HashMap(O(1)查找)代替ArrayList(O(n)查找),或优化算法逻辑(如用快速排序代替冒泡排序)。数据库层面瓶颈及优化
数据库访问是Java应用的常见性能瓶颈,尤其在数据量大或查询复杂时。
SELECT *会读取所有字段,增加IO开销;未创建索引的查询会导致全表扫描。建议只查询必要字段(如SELECT id, name FROM user),并为常用查询条件创建索引(如CREATE INDEX idx_name ON user(name))。maximumPoolSize设置为CPU核心数的2倍),并设置合理的超时时间(如connectionTimeout=3000)。系统资源层面瓶颈及优化
Ubuntu系统的资源限制会直接影响Java应用的运行效率。
ulimit -n 65535临时调整,或修改/etc/security/limits.conf永久生效(如* soft nofile 65535)。noatime减少不必要的写入)。iftop监控网络带宽使用,调整内核参数(如net.core.somaxconn=65535增加TCP连接队列长度,net.ipv4.tcp_max_syn_backlog=65535增加SYN队列长度)。JVM监控与分析工具
定位性能瓶颈需借助工具实时监控系统状态:
jstat监控GC情况(如jstat -gcutil <pid> 1000每秒输出GC统计)、jmap查看堆内存分布(如jmap -histo <pid>显示对象数量及占用空间)、jstack分析线程状态(如jstack <pid>查看线程阻塞情况)。VisualVM整合了jstat、jmap等功能,提供直观的CPU、内存、线程监控界面;JProfiler支持内存泄漏检测、方法热点分析,适合深度性能调优。