一、JVM内存参数调优
-Xms(初始堆内存)和-Xmx(最大堆内存)设置堆内存范围。建议将两者设为相同值(如-Xms4g -Xmx4g),避免堆内存动态扩展带来的性能损耗。初始值通常设置为操作系统可用内存的1/64,最大值不超过1/4(需根据应用实际内存需求调整)。-Xmn(新生代大小)直接设置新生代内存(如-Xmn2g),或通过-XX:NewRatio(老年代与新生代比例,如-XX:NewRatio=2表示老年代占堆的2/3)间接设置。新生代过小会导致频繁Minor GC,过大则会增加Full GC时间。-XX:+UseG1GC)适合大内存、低延迟应用,可通过-XX:MaxGCPauseMillis设置目标最大GC停顿时间(如200ms);ZGC(-XX:+UseZGC)适合超大内存(TB级)场景,停顿时间极短但吞吐量略低。-XX:+PrintGCDetails打印GC详细日志,-Xloggc:/path/to/gc.log将日志输出到文件,便于分析GC频率、持续时间及内存回收效率。结合工具(如GCViewer)可快速定位GC瓶颈。二、代码层面优化
String str = new String("test")改为String str = "test"),优先使用对象池(如数据库连接池、线程池)重用对象,降低垃圾回收压力。ArrayList(数组结构,插入删除时间复杂度O(n))优于LinkedList(链表结构,随机访问时间复杂度O(n));需要快速查找时使用HashMap(哈希表,O(1))优于TreeMap(红黑树,O(log n))。List list = new ArrayList();置为null),确保数据库连接、文件流等资源在使用后通过try-with-resources语句自动关闭,防止资源堆积导致内存溢出。三、操作系统层面优化
vm.swappiness值(如sysctl -w vm.swappiness=10,默认60),减少系统对Swap空间的依赖,避免内存不足时频繁换页导致性能下降;调整vm.overcommit_memory为1(允许内存超额分配),适应内存需求波动大的应用。dd if=/dev/zero of=/swapfile bs=1M count=4096,创建4GB Swap文件),并执行mkswap /swapfile和swapon /swapfile启用,缓解内存压力。systemctl list-unit-files --type=service查看系统服务,停止无用服务(如cups打印服务、bluetooth蓝牙服务),释放内存资源。四、启动与类加载优化
-Xshare:on参数开启类数据共享(CDS),将常用类加载到共享内存中,减少多个JVM实例重复加载类的开销,提升启动速度(适用于多JVM部署场景)。@Lazy注解延迟加载Spring Bean),减少启动时加载的类数量和初始化操作,缩短启动时间。五、监控与持续优化
jstat -gcutil <pid>监控GC情况(如Eden区、老年代使用率),jconsole或VisualVM可视化监控堆内存、线程、CPU等指标,及时发现内存异常(如持续Full GC)。OutOfMemoryError时,添加-XX:+HeapDumpOnOutOfMemoryError和-XX:HeapDumpPath=/path/to/dump.hprof参数生成堆转储文件,使用MAT(Memory Analyzer Tool)分析内存泄漏点(如大对象占用、对象引用链)。