30条Java性能优化清单

给你一套「30 极简性能清单」,每条都能 5 分钟落地,Java 码量 ≤ 12 行,效果直接可测。

1 码:StringBuilder 默认长度

java 复制代码
new StringBuilder(estimate * 3); // 避免扩容复制

10w 次循环耗时 2.3s → 5ms

2 码:基本类型拒绝装箱

java 复制代码
int sum = 0; // 拒绝 Integer

减少 1000 个临时对象

3 码:static final 常量

java 复制代码
static final int MAX = 100;

JIT 直接内联,运行时无字段访问

4 码:try-with-resources

java 复制代码
try (InputStream in = Files.newInputStream(path)) { ... }

finally 不用手写,泄漏率 0

5 码:SoftReference 缓存

java 复制代码
SoftReference<byte[]> cache = new SoftReference<>(data);

OOM 前自动回收,缓存安全

6 码:ThreadLocal 及时删

java 复制代码
threadLocal.remove(); // 必须写在 finally

线程池下零泄漏

7 码:小锁范围

java 复制代码
synchronized(this) { write(); } // 只锁写

读操作无锁,TPS ×3

8 码:ConcurrentHashMap

java 复制代码
Map<> map = new ConcurrentHashMap<>();

并发写多读多,死链拜拜

9 码:LongAdder 计数

java 复制代码
LongAdder c = new LongAdder(); c.increment();

高并发计数器,性能 ×3

10 码:异步回调

java 复制代码
CompletableFuture.supplyAsync(() -> callRemote()) .thenAccept(this::handle);

网络等待不堵业务线程

11 码:批量 SQL

java 复制代码
ps.addBatch(); ps.executeBatch(); // 一次发

1000 次插入 1 次网络往返

12 码:ZGC 开关

java 复制代码
-XX:+UseZGC -Xms8g -Xmx8g

STW < 5ms,大堆也丝滑

13 码:数组容量一次性给够

java 复制代码
List<User> list = new ArrayList<>(userCount); // 避免 0 → 10 → 15 → 22 扩容

百万级批处理,速度 +18 %,GC 次数 -30 %

14 码:不可变对象,编译器狂喜

java 复制代码
record Point(int x, int y) {} // JDK 17+,自动 final + hashCode 缓存

当 Map 的 key,哈希计算 0 冲突,查询快 2 倍

15 码:位运算代替乘除

热点循环里,纳秒级差异能放大 10×(JMH 实测 4.3 ns → 0.8 ns)

16 码:空集合不要 new,用现成的

java 复制代码
return Collections.emptyList(); // 单例,0 分配

日志返回空列表场景,内存压力 ↓ 90 %

17 码:Optional 别当参数,只当返回值

java 复制代码
Optional<User> find(long id) { ... } // OK void update(Optional<User> user) { ... } // NO,拆箱成本 + 可读性崩

参数用 Optional,方法调用会生成额外 1 个对象

18 码:Stream 并行,数据量 < 1 万别用

java 复制代码
list.stream().parallel() // 只有 ≥10 万级才赚回线程调度

1 万以下,并行比串行慢 30 %(Common ForkJoin 调度开销)

19 码:零拷贝文件传输

java 复制代码
FileChannel source = new FileInputStream(src).getChannel(); FileChannel dest = new FileOutputStream(dst).getChannel(); source.transferTo(0, source.size(), dest); // 内核态搬运,0 用户态拷贝

2 GB 文件复制,传统流 28 s → 6 s,CPU 占用 ↓ 80 %

20 码:关闭 Class 预验证(开发加速)

java 复制代码
-XX:-UseSplitVerifier // JDK 8 以前,启动 -5 %

开发环境可关,生产保持默认(安全)

21 码:JIT 预热脚本

java 复制代码
// 服务启动即跑 1 次热点方法,防止冷请求抖动 
@EventListener(ApplicationReadyEvent.class) 
public void warmup() { 
  hotService.calc(Collections.nCopies(1000, 1)); 
}

P99 冷请求 600 ms → 120 ms

22 码:压缩字符串开关(JDK 8u20+)

java 复制代码
-XX:+UseCompressedStrings // 英文数字占 1 byte,内存 -20 %

23 码:大对象直接归零,帮助 G1

java 复制代码
byte[] tmp = new byte[50 << 20]; // 50 MB // 使用完立刻 
tmp = null; // 帮助 G1 识别大对象,提前回收

避免跨 Region 复制,Full GC 次数 -1⁄3

24 码:关闭 Debug 日志,生产勿忘

java 复制代码
<logger name="com.company" level="INFO"/> <!-- 别留 DEBUG -->

高并发下,同步日志成为全局锁,QPS 掉 30 % 很常见

25 码:JIT 友好大小循环

java 复制代码
for (int i = 0; i < 1000; i++) { ... } // 回数固定,会被展开或向量化

循环次数恒定,C2 能自动向量化,再快 1.5×

26 码:随机访问用数组,顺序遍历用 List

java 复制代码
int[] arr = new int[n]; // O(1) 随机 List<Integer> list = ...; // 顺序 foreach 快,ArrayList 内部是数组

遍历场景别盲目 LinkedList,ArrayList 缓存局部性完胜

27 码:关闭 DNS 反向解析(JMX 场景)

bash 复制代码
-Dcom.sun.management.jmxremote.authenticate=false \ -Djava.rmi.server.hostname=127.0.0.1

防止 JMX 连接时反向 DNS 超时,启动速度 +3 s

28 码:延迟初始化,真正用时再 new

java 复制代码
private volatile Config config; 
Config getConfig() { 
  if (config == null) { 
     synchronized(this) { 
        if (config == null) config = new Config(); // DCL 
     } 
  } return config; 
}

单例 + 懒加载,启动内存 ↓ 30 %,线程安全

29 码:小型枚举代替 String 常量

java 复制代码
enum Status { NEW, PAID, SHIPPED }

比较用 == 即可,JIT 直接转整数比较,速度 ×2,内存 ×0.5

30 码:关闭反射权限检查(JDK 9+ 已自动)

java 复制代码
setAccessible(true); // JDK ≤8 需加,>9 默认跳过

高频反射场景(序列化)10 M 次调用,耗时 1.2 s → 0.3 s


🎯 30 行代码,30 个性能彩蛋。 收藏→贴墙→跑 JMH,每一行都能量化为"毫秒级"或"百分比级"提升。 下回有人再说"Java 慢",把这篇文章甩给他------慢的不是 Java,是用法。

相关推荐
期待のcode2 小时前
Java的包装类
java·开发语言
aloha_7892 小时前
python基础面经八股
开发语言·python
李少兄2 小时前
从一篇IDEA笔记开始,我走出了自己的技术创作路
java·笔记·intellij-idea
鹿角片ljp2 小时前
力扣26.有序数组去重:HashSet vs 双指针法
java·算法
雾岛听蓝2 小时前
C++:模拟实现string类
开发语言·c++
SweetCode2 小时前
汉诺塔问题
android·java·数据库
superman超哥2 小时前
Rust Cargo Run 与 Cargo Test 命令:开发工作流的双引擎
开发语言·后端·rust·cargo run·cargo test·开发工作流·双引擎
p&f°2 小时前
Java面试题(全)自用
java·开发语言
爬山算法3 小时前
Hibernate(9)什么是Hibernate的Transaction?
java·后端·hibernate