Java性能优化听起来高深,但很多问题并不需要重构代码或更换框架。下面这10个技巧,改动小、见效快,做完立刻能感受到QPS提升或延迟下降。
1. 循环内字符串拼接改用StringBuilderstr += "a"在循环中会不断创建新String对象,GC压力巨大。换成StringBuilder,只创建一个可变对象,循环越大效果越明显。这是最经典的优化,没有之一。
2. 集合初始化指定容量new ArrayList<>()默认容量10,扩容时数组复制开销大。如果已知要存1000个元素,直接new ArrayList<>(1000),省去多次扩容和复制。HashMap同理,预估容量能显著减少rehash。
3. 用基本类型替代包装类型Integer比int多一个对象头,自动装箱拆箱还额外消耗CPU。局部变量、方法参数、循环计数器,能用int就别用Integer。数据量大时,内存和GC差距非常明显。
4. 使用缓冲流进行I/O操作直接FileInputStream读文件,每次read都是一次系统调用。包一层BufferedInputStream,一次读8KB,系统调用次数骤降。写文件同理,BufferedWriter比FileWriter快数倍。
5. 减少不必要的对象创建循环里new Date()、new SimpleDateFormat都是重灾区。SimpleDateFormat线程不安全,但可以每个线程一个或改用DateTimeFormatter。能复用就复用,别让GC天天加班。
6. 缩小局部变量作用域变量声明离使用越近越好,方法结束就能被回收。长生命周期的大对象会一直占用内存,拖慢GC。把大对象拆小、用完置null,虽然老生常谈,但确实立竿见影。
7. 用System.arraycopy复制数组手写for循环复制数组,JIT未必能优化到极致。System.arraycopy是native方法,底层用内存拷贝,速度极快。集合之间的复制、数组扩容,优先用它。
8. 并发场景用ConcurrentHashMapCollections.synchronizedMap全表锁,并发一高就排队。ConcurrentHashMap分段锁或CAS,读几乎无锁,写只锁桶。高并发下吞吐量差一个数量级,换就对了。
9. 合理设置JVM堆和垃圾回收器-Xms和-Xmx设成一样,避免堆动态调整。低延迟用G1或ZGC,吞吐优先用Parallel。默认参数适合开发,不适合生产。调完重启,监控GC日志,效果肉眼可见。
10. 懒加载加缓存,避免重复计算单例饿汉式启动慢,改懒汉式或静态内部类。频繁调用的方法,结果不变就加缓存,比如配置读取、正则编译。一次计算多次使用,CPU省下来干正事。
总结
性能优化不一定要大动干戈。这10个技巧覆盖了字符串、集合、I/O、并发和JVM,每个改动都不超过十行代码,但累积起来能让系统快上一大截。先测量再优化,用数据说话,别凭感觉。从今天开始,挑三个改到项目里,你会回来感谢自己的。