1. 确定Java应用当前内存使用情况
优化前需先了解应用的真实内存需求,避免盲目调整。使用VisualVM、JConsole或JDK自带工具(如jstat -gc <pid>查看GC情况、jmap -heap <pid>查看堆内存分布)监控内存使用量、GC频率及耗时,明确堆内存、元空间(Metaspace)等关键区域的使用瓶颈。
2. 调整堆内存大小(核心参数)
堆内存是Java对象的主要存储区域,其设置直接影响应用性能。需根据应用实际需求调整:
-Xms512m),避免启动时频繁扩容导致的性能波动;-Xmx2g),建议与-Xms保持一致(如-Xms2g -Xmx2g),减少运行时动态调整的开销;-XX:NewRatio=1,各占1/2);若长期对象较多,可减小新生代比例(如-XX:NewRatio=3,新生代占1/4)。3. 配置元空间(方法区)大小
元空间用于存储类元数据(如类结构、方法信息),取代了旧版本的永久代(PermGen)。需避免元空间溢出(OutOfMemoryError: Metaspace):
-XX:MetaspaceSize=128m);-XX:MaxMetaspaceSize=256m),防止无限制占用内存。4. 选择合适的垃圾回收器
垃圾回收(GC)是影响Java应用性能的关键因素,需根据应用特点选择:
-XX:+UseG1GC启用;可设置-XX:MaxGCPauseMillis=200(目标最大GC停顿时间,默认200ms)和-XX:InitiatingHeapOccupancyPercent=45(触发GC的堆占用率阈值,默认45%);-XX:+UseParallelGC(新生代)和-XX:+UseParallelOldGC(老年代)启用,可通过-XX:ParallelGCThreads=<CPU核心数>设置并行线程数(如-XX:ParallelGCThreads=4);-XX:+UseConcMarkSweepGC启用。5. 优化系统级内存设置
sudo fallocate -l 1G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
永久生效:在/etc/fstab中添加/swapfile none swap sw 0 0。可通过sudo swapon --show确认Swap是否启用。vm.swappiness(系统使用Swap的倾向,值越小越倾向于使用物理内存),默认值为60,可设置为10-30(如echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf,然后sudo sysctl -p)。6. 代码层面优化(减少内存占用)
String str = new String("hello")改为String str = "hello"),重用对象(如使用StringBuilder代替字符串拼接);ArrayList代替LinkedList(随机访问多)、HashMap代替TreeMap(无序场景));WeakReference)或软引用(SoftReference)缓存(如缓存图片时,内存不足时自动回收)。7. 监控与迭代优化
优化后需持续监控应用性能,验证调整效果:
jstat -gcutil <pid> 1000(每秒输出一次GC统计信息)、jmap -histo:live <pid>(查看对象分布)监控内存使用;-Xloggc:/path/to/gc.log参数),查看GC频率、停顿时间及回收效率;Full GC),需调整堆大小或GC参数;若元空间使用率接近上限,需增大-XX:MaxMetaspaceSize。