1. 监控当前内存使用情况
在优化前,需通过工具定位内存瓶颈。常用工具包括:
jstat -gcutil <pid> 1000每秒显示一次GC统计);jmap -dump:live,format=b,file=heapdump.hprof <pid>);2. 调整JVM堆内存参数
堆内存是Java应用的主要内存消耗区域,需合理设置初始大小(-Xms)和最大大小(-Xmx):
-Xms和-Xmx设为相同值(如-Xms2g -Xmx2g),防止运行时堆大小变化导致性能波动;3. 优化非堆内存(元空间)设置
Java 8及以上版本用**元空间(Metaspace)**替代永久代(PermGen),需调整其大小以避免溢出:
-XX:MetaspaceSize(初始大小,默认21M)和-XX:MaxMetaspaceSize(最大大小,默认无限制,建议设为256M-512M);OutOfMemoryError。4. 选择合适的垃圾回收器
垃圾回收(GC)对内存使用和性能影响大,需根据应用特点选择:
-XX:+UseG1GC启用,可设-XX:MaxGCPauseMillis(目标最大停顿时间,默认200ms)平衡延迟与吞吐;-XX:+UseParallelGC启用,适合批处理应用;5. 调整GC相关参数
优化GC行为可减少内存占用和停顿时间:
-XX:NewSize(初始新生代大小)和-XX:MaxNewSize(最大新生代大小)调整,一般设为堆内存的1/3-1/2(如-Xmn1g);-XX:SurvivorRatio(伊甸区与Survivor区比例,默认8:1:1)调整,如-XX:SurvivorRatio=6表示伊甸区:Survivor区=6:1:1;-XX:MaxGCPauseMillis设定期望最大停顿时间(如-XX:MaxGCPauseMillis=100),G1GC会根据此目标调整策略。6. 系统级优化
sudo fallocate -l 1G /swapfile→sudo chmod 600 /swapfile→sudo mkswap /swapfile→sudo swapon /swapfile),并添加到/etc/fstab实现永久生效;/etc/sysctl.conf,添加vm.swappiness=10(降低Swap使用倾向,值越小越倾向于使用物理内存)、vm.overcommit_memory=1(允许内存超额分配),然后运行sudo sysctl -p生效。7. 容器化环境优化(如Docker)
若应用运行在容器中,需限制内存使用以避免影响宿主机和其他容器:
-Xmx参数限制JVM最大内存(如-Xmx1g);--XX:MaxRAMPercentage设置JVM内存占容器总内存的比例(如--XX:MaxRAMPercentage=70.0,表示使用容器的70%内存);-Xmx值,留出足够空间给JVM自身开销。8. 代码层面优化
从根源减少内存使用:
String str = new String("hello")改为String str = "hello");ArrayList适合随机访问,LinkedList适合频繁插入删除);BufferedReader)和批量处理(如JDBC的batchUpdate)减少I/O开销。