这是一个创建于 1763 天前的主题,其中的信息可能已经有所发展或是发生改变。
突然看到前 2 年前自己在一篇文章写的评论,感觉写得还行,大家看看有没有问题和补充的地方。
原评论内容如下:
陈大讲的比较有高度,我来说点具体的,做 Java 后端开发可能会涉及的一些性能优化。进程内缓存,如用 Map、List 来缓存一些基础数据。如果需要更灵活的操作缓存数据,如自动过期或定期更新,可以使用 Guava 的 LoadingCache。为了减少对 Java GC 的影响,或者避免用户态与内核态的数据拷贝成本,也可以使用直接内存。但要小心使用,无节制的使用或者没回收内存将可能带来灾难性的后果,例如 Netty 就有监测是否有内存泄漏的开关,Netty 在这方面已经玩得很溜了。大数据量的缓存,或者需要支持分布式访问,可以考虑使用 Redis,记得设置过期时间哦。对于不需要实时响应或同步处理的请求,可以通过消息队列来实现异步化,根据实际业务场景来异步反馈结果,或者只须持久化数据。消息队列在削峰方面非常有用,可以很好的应对突发流量,或者是业务在促销期间的高峰,从而让业务下游可以平滑的处理请求。应用服务间的调用可以采用批量发送来提高吞吐。IO 密集型的操作或调用可以适当增加线程数,调高调用线程数对于跨机房调用有非常大的提升作用。服务之间尽量同机房或就近机房部署,降低延迟。减少大对象,降低对象存活时间,从而降低 Full GC 的可能性。有些语言或第三方的 API 内部逻辑很耗时,必要时可自己实现,如 BeanUtils.copyProperties 方法。无锁化,如数据分片存储,ThreadLocal。减小锁粒度,减小锁的范围,通常锁代码块优于锁方法。使用乐观锁,如 Java 中的原子类采用自旋+CAS。