java 如何 节省 resource
资源释放与关闭
在Java中,资源如文件流、数据库连接、网络连接等需要显式关闭以避免泄漏。使用try-with-resources语法可以确保资源自动关闭,即使在发生异常时也能正确释放。
try (FileInputStream fis = new FileInputStream("file.txt");
BufferedInputStream bis = new BufferedInputStream(fis)) {
// 使用资源
} catch (IOException e) {
e.printStackTrace();
}
对象池技术
对于创建成本高的对象(如数据库连接),采用对象池(如Apache Commons Pool、HikariCP)复用实例。通过预先创建并管理对象集合,减少频繁创建销毁的开销。
// HikariCP连接池示例
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/db");
config.setUsername("user");
config.setPassword("pass");
HikariDataSource pool = new HikariDataSource(config);
缓存策略
利用缓存(如Guava Cache、Caffeine)存储频繁访问的数据,减少重复计算或I/O操作。根据业务场景设置合适的缓存大小和过期策略。
Cache<String, Object> cache = Caffeine.newBuilder()
.maximumSize(1000)
.expireAfterWrite(10, TimeUnit.MINUTES)
.build();
延迟初始化
对非必要立即加载的资源采用懒加载(Lazy Initialization),通过Supplier或双重检查锁定实现按需分配。
// 双重检查锁定示例
private volatile ExpensiveObject instance;
public ExpensiveObject getInstance() {
if (instance == null) {
synchronized (this) {
if (instance == null) {
instance = new ExpensiveObject();
}
}
}
return instance;
}
内存优化
- 使用基本类型(如
int)替代包装类(如Integer)减少内存占用 - 避免频繁字符串拼接,优先使用
StringBuilder - 对大型集合使用
Collections.unmodifiableList()防止意外修改
并发资源控制
通过信号量(Semaphore)限制并发访问资源数,避免资源过载。
Semaphore semaphore = new Semaphore(10); // 允许10个并发
semaphore.acquire();
try {
// 访问受限资源
} finally {
semaphore.release();
}
JVM调优
- 设置合适的堆内存参数(
-Xms,-Xmx) - 选择高效的垃圾收集器(如G1 GC)
- 使用
-XX:+UseCompressedOops压缩对象指针
弱引用与软引用
对非关键数据使用WeakReference或SoftReference,允许GC在内存不足时回收对象。

WeakReference<byte[]> weakRef = new WeakReference<>(new byte[1024]);






