1. 监控系统资源占用,定位高负载根源
使用Ubuntu自带命令(如top、htop、free -h、vmstat)实时查看CPU、内存、磁盘I/O的使用情况。top命令按P键按CPU使用率排序,M键按内存使用率排序,快速识别占用高的进程;free -h查看内存总量及剩余空间;vmstat 1监控系统整体性能(如上下文切换次数、阻塞进程数)。对于Java项目,重点关注Java进程的CPU占用(是否因线程死循环导致)和内存占用(是否接近JVM堆上限)。此外,可使用jstat -gcutil <pid> 1000监控JVM垃圾回收情况(如老年代GC频率过高可能提示内存泄漏)。
2. 优化Java应用内存配置,避免内存泄漏
-Xms(初始堆大小)和-Xmx(最大堆大小),建议设置为服务器可用内存的70%-80%(如16GB内存可设为-Xms10g -Xmx14g),避免频繁扩容导致性能下降。-XX:+UseG1GC);对于低延迟应用,使用ZGC(-XX:+UseZGC,需JDK 11+)或Shenandoah(-XX:+UseShenandoahGC),减少GC停顿时间。jmap -dump:format=b,file=heap.hprof <pid>生成),查看是否有对象持续增长(如静态集合类持有大量对象引用、未关闭的数据库连接/IO流、缓存未设置过期时间)。常见泄漏场景包括:数据库连接未用try-with-resources关闭、缓存无限增长(如未设置LRU策略)、线程池未正确关闭。3. 优化Java应用代码,减少资源消耗
ThreadPoolExecutor)复用对象,减少GC压力;避免在循环内创建临时对象(如String str = new String("xxx"),改用StringBuilder)。HashMap,频繁插入/删除用LinkedList,需要有序数据用TreeMap),减少内存占用和操作时间。java.nio包)替代传统BIO(java.io包),如使用ByteBuffer进行缓冲读写,减少系统调用次数;对于大文件处理,使用Files.lines()流式读取,避免一次性加载到内存。4. 调整Ubuntu系统配置,提升资源利用率
vm.swappiness(交换分区使用倾向,值越低越倾向于使用物理内存),建议设为10以下(sudo sysctl vm.swappiness=10);调整vm.dirty_ratio(脏页比例,超过则触发写回磁盘),建议设为10(sudo sysctl vm.dirty_ratio=10),减少磁盘I/O压力。zram-config(sudo apt install zram-config),系统会自动创建zRAM设备并启用。systemctl list-unit-files --type=service查看所有服务,禁用不需要的服务(如sudo systemctl disable bluetooth),释放系统资源。5. 扩展硬件资源或分布式部署