核心思路是让对象“能复用就不新建”,从源头降低gc压力和内存分配开销;高频创建对象会快速填满eden区,触发频繁minor gc;循环内对象复用、stringbuilder.setlength(0)、arraylist.clear()、自定义对象setter更新、工具类单例或池化、基本类型替代包装类、合理初始化集合、避免过度封装。

核心思路是让对象“能复用就不新建”,从源头降低 GC 压力和内存分配开销。高频创建对象(尤其是循环内、请求内、短生命周期场景)会快速填满 Eden 区,触发频繁 Minor GC,拖慢响应、抬高延迟。
循环内对象复用
把对象声明提到循环外,每次复位状态而非新建。
- 字符串拼接统一用 StringBuilder,调用
setLength(0)清空内容,避免反复 new - 集合类如 ArrayList 可复用:
list.clear()后继续 add,注意 clear 不释放底层数组内存,适合固定量级数据 - 自定义对象(如 DTO、临时计算类)在循环中只 new 一次,用 setter 更新字段值
高频工具类单例或池化
像 ObjectMapper、SimpleDateFormat、HttpClient 这类构造成本高、线程安全需额外保障的类,绝不能每次调用都 new。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 无状态工具类直接声明为 static final 单例(如 Jackson 的 ObjectMapper)
- 有状态或需隔离上下文的,用轻量级对象池(如 Apache Commons Pool 或 HikariCP 风格的简易池)管理生命周期
- 避免“伪单例”:比如把 SimpleDateFormat 设为 static 但没加锁,反而引发线程安全问题
善用基本类型与不可变对象
减少包装类和中间对象的隐式生成。
- 计数、状态标识优先用 int/long/boolean,而非
Integer、Boolean - 避免自动装箱拆箱:比如
map.put("key", 123)比map.put("key", Integer.valueOf(123))更稳妥 - 字符串常量拼接由编译器优化,放心用
"a" + "b";但运行时拼接必须走 StringBuilder
按场景选对数据结构与初始化策略
对象创建少,不等于性能就好——结构不合理照样白忙活。
- 已知容量时,ArrayList 初始化指定
initialCapacity,避免多次扩容复制 - 大量查找优先用 HashMap/HashSet,别用 ArrayList 做 O(n) 遍历
- 避免“过度封装”:比如为一个简单数值计算新建 5 层嵌套对象,直接用局部变量+方法拆分更高效
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










